实现网站开发,在线平面图设计,成都有什么好玩的地方 排行榜,小说网站开发引言
在现代 Web 开发中#xff0c;API 是前后端分离架构的核心。FastAPI 凭借其高性能、简洁的语法和自动文档生成功能#xff0c;成为 Python 开发者的首选框架。本文将从零开始#xff0c;详细讲解 FastAPI 的核心概念、安装配置、路由设计、请求处理以及实际应用案例API 是前后端分离架构的核心。FastAPI 凭借其高性能、简洁的语法和自动文档生成功能成为 Python 开发者的首选框架。本文将从零开始详细讲解 FastAPI 的核心概念、安装配置、路由设计、请求处理以及实际应用案例助你快速掌握这一高效工具。
一、FastAPI 概述与安装
1.1 什么是 FastAPI
FastAPI 是一个基于 Python 3.8 的现代 Web 框架专注于构建高性能 RESTful API。其核心特点包括
基于 Starlette 和 Pydantic提供异步支持和严格的数据验证。自动生成 API 文档内置 Swagger UI 和 ReDoc开发者无需手动维护文档。类型提示Type Hints利用 Python 的类型系统实现输入参数验证和代码提示。
1.2 FastAPI 的优势
特性说明高性能异步处理能力ASGI支持高并发性能媲美 Node.js 和 Go。开发效率高通过类型提示和自动文档生成减少代码冗余和调试时间。生态完善可无缝集成 SQLAlchemy、OAuth2、JWT 等常用库。
1.3 安装与环境配置及第一个FastApi应用
1.3.1、安装与环境配置
步骤 1安装依赖库
pip install fastapi # FastAPI 依赖 Python 3.8 及更⾼版本
步骤 1安装uvicorn服务器
pip install uvicorn[standard] # 安装 ASGI 服务器 1.3.2、第一个FastApi应用
创建 test_one.py
from fastapi import FastAPI # 导⼊FastAPI⽤于定义APIapp FastAPI() # 创建FastAPI实例# http请求方式类型get、post、put、update、delete
# 浏览器默认访问的是get类型如果使用其他形式访问
# 出现405的提示请求的方式不匹配# 不带参数的访问形式
# 访问地址http://127.0.0.1:8000
app.get(/)
async def test_one():return {message: My first fastapi project}# 带一个参数的时候的访问形式
# 访问地址http://127.0.0.1:8000/hello/小宁
app.get(/hello/{name})
async def hello(name: str):return {hello: ffastapi {name}}# 带一个参数的时候的访问形式
# 访问地址http://127.0.0.1:8000/my/小宁,21/长沙
app.get(/my/{name},{age}/{addr})
async def test_one(name: str, age: int, addr: str):return {name: name, age: age, addr: addr}
启动uvicorn服务器 # 在Terminal中输入
# 语法uvicorn 文件的相对路径实例名 --reload
# reload表示热启动后端代码改变时前端页面也会随之改变
uvicorn csdn.test_one:app --reload
运行结果 注意事项
1、传入参数的时候不能多传也不能少传。
2、传入的参数一定要满足自己设置的http网址的层级格式。
3、传入的参数要满足函数设置的参数类型。
二、快速入门案例解析
2.1、union的可选参数 创建 test_two.py
from typing import Union # 导⼊Union, ⽤于定义可选类型
from fastapi import FastAPI # 导⼊FastAPI,⽤于构建RESTful APIapp FastAPI()# 创建FastAPI实例# 访问地址http://127.0.0.1:8000/items/100q小宁
app.get(/items/{item_id})
# 定义路由,访问根路径调⽤read_item函数传⼊item_id参数并返回该参数对应的数据
# q: Union[str, None] None ⽤于定义q的可选类型为str或int或None
# 如果http没有传入参数时候默认为None避免用户没传入参数网页就跑不出来的情况
async def read_item(item_id: int, q: Union[str,int, None] None):return {item_id: item_id, q: q}
代码解析
路径参数{item_id} 动态匹配 URL 中的值自动转换为整数类型。查询参数q 通过 Union[str, None] 声明为可选参数。自动验证若传入非整数 item_idFastAPI 返回 HTTP 422 错误。
启动uvicorn服务器 uvicorn csdn.test_two:app --reload 运行结果 2.2、uvicorn.run和pydantic类结合Apifox
在前面的课堂案例中我们启动服务器都要打开终端Timinal中输入启动服务器的语句那么每次启动都要输出启动的语句那就很麻烦了有没有什么办法可以要启动服务器和和之前一样只要点击运行就能够启动呢所以我们接下来就会讲到uvicorn.run启动服务器。
在前面的内容我们讲过浏览器默认的请求方式是get,那么假如我们的http请求方式是post等其他类型的时候怎么办呢那么就需要使用Apifox软件了这个大家可以直接官网直接下载。
创建 test_three.py from fastapi import FastAPI # 引⼊FastAPI类,⽤于创建⼀个应⽤
import uvicorn # 引⼊uvicorn,⽤于启动服务
from typing import Union #引⼊Union类⽤于类型注解
from pydantic import BaseModel # 引⼊pydantic类⽤于定义数据结构app FastAPI() # 创建⼀个应⽤,app是⼀个FastAPI实例class Item(BaseModel):# 定义⼀个Item类继承⾃BaseModel⽤于定义请求体中的数据结构# 定义⼀个name属性类型为strname: str# 定义⼀个price属性类型为floatprice: float# 定义⼀个is_offer属性类型为Union[bool, None]默认为Noneis_offer:Union[bool, None] Noneapp.get(/) # 装饰器表示定义⼀个根路径的get请求
# 定义⼀个根路径的get请求,返回⼀个字典,键值分别为Hello和World
# async 表示异步请求,可以提⾼性能
# 测试访问http://127.0.0.1:8000/
async def read_root():return {Hello: World}app.get(/items/{item_id})
# 定义⼀个路径参数为item_id的get请求,返回⼀个字典,键值分别为item_id和q
# Union[str, None] 表示q可以为str类型或者None类型默认为None
# 测试访问http://127.0.0.1:8000/items/3?qabc
async def read_item(item_id: int, q: Union[str, None] None):return {item_id: item_id, q: q}app.put(/items/{item_id})
# 测试访问http://127.0.0.1:8000/items/3
async def update_item(item_id: int, item:Item):# 定义⼀个路径参数为item_id的put请求,返回⼀个字典,键值分别为item_name和item_idreturn {item_name: item.name, item_id: item_id,item_price: item.price,is_offer: item.is_offer}
# Item类类型传参数的时候要使用apidox中的body中的json格式字典格式if __name__ __main__:# 启停⽅式# 1.⽅式1指令式# 服务器启动指令 uvicorn main:app --reload# fastDemo1:app 表示main.py⽂件中的app实例# 服务器停⽌指令 ctrlc# 2.⽅式2界⾯式# ⿏标右键启动----》run main.py# 界⾯右上⻆的停⽌按钮# 启动服务,host指定主机地址,port指定端⼝号,reloadTrue表示当代码发⽣变化时,⾃动重启服务# main:app---- 表示main.py⽂件中的app实例uvicorn.run(bbb:app, host127.0.0.1, port8080, reloadTrue) 运行结果 这里是Apifox的操作截图 三、路由分发
3.1、为什么需要路由分发
在小型项目中所有路由都写在 main.py 中尚可接受。但随着项目规模扩大如构建包含用户、订单、商品等多个模块的电商系统将所有路由集中在一个文件会导致
代码臃肿数千行代码堆积难以阅读和维护。协作困难多人同时修改同一文件容易引发冲突。复用性差相同功能的路由无法快速移植到其他项目。
路由分发Route Distribution通过 模块化拆分路由将不同功能的路由分散到多个文件中最终通过统一入口集成完美解决上述问题。
3.2、图书管理系统 cbs.py源码 # 出版社分发路由配置
from fastapi import APIRouterapi_cbs APIRouter()api_cbs.get(/get)
async def get_test():return {methods: 出版社分发路由get方法}api_cbs.post(/post)
async def post_test():return {methods: 出版社分发路由post方法}api_cbs.put(/put)
async def put_test():return {methods: 出版社分发路由put方法}api_cbs.delete(/delete)
async def delete_test():return {methods: 出版社分发路由delete方法} ts.py源码 # 图书分发路由配置
from fastapi import APIRouterapi_ts APIRouter() # 创建路由api_ts.get(/get)
async def get_test():return {methods: 图书分发路由get⽅法}api_ts.post(/post)
async def post_test():return {methods: 图书分发路由post⽅法}api_ts.put(/put)
async def put_test():return {methods: 图书分发路由put⽅法}api_ts.delete(/delete)
async def delete_test():return {methods: 图书分发路由delete⽅法} zz源码 # 图书分发路由配置
from fastapi import APIRouterapi_ts APIRouter() # 创建路由api_ts.get(/get)
async def get_test():return {methods: 图书分发路由get⽅法}api_ts.post(/post)
async def post_test():return {methods: 图书分发路由post⽅法}api_ts.put(/put)
async def put_test():return {methods: 图书分发路由put⽅法}api_ts.delete(/delete)
async def delete_test():return {methods: 图书分发路由delete⽅法} main源码 from fastapi import FastAPI
from csdn.ts import api_ts
from csdn.cbs import api_cbs
from csdn.zz import api_zz
app FastAPI()#include_router()⽅法⽤于将分发路由添加到app中prefix参数为路由前缀tags参数为标签
app.include_router(api_ts, prefix/ts, tags[图书])
app.include_router(api_cbs, prefix/cbs, tags[出版社])
app.include_router(api_zz, prefix/zz, tags[作者]) 运行结果 提示其他的需要访问的时候要使用Apifox来访问因为其他的http的请求方式都不是get不能使用浏览器直接访问。 四、request对象的入门 在实际开发过程中有些时候我们需要通过Request对象直接获取⼀些信息如我们希望获取客户端的 IP等信息此时我们在路由操作函数中直接定义类型为Request的对象参数就可以在代码中使⽤Request对象进⾏数据的获取。 假设在路由函数中定义了request:Request那么该对象可以获取到哪些信息呢 代码示例
from fastapi import FastAPI,Request
app.put(/req/)
async def req(request: Request):req_method request.method #请求的方式req_url request.base_url # 请求的路径req_port request.url.port #请求的端口res_json request.json() # 请求json数据res_arg1 request.url.query # 请求查询参数1res_arg2 request.query_params # 请求查询参数2print(f请求的方式:{req_method},请求的路径:{req_url},#请求的端口:{req_port},请求json数据:{res_json}f请求查询参数1:{res_arg1},请求查询参数2:{res_arg2})
在Aifox中发送请求:
参数 json参数 运行结果 五、总结
FastAPI 凭借其高性能和开发效率已成为构建现代 API 的首选框架。通过本文的学习你已经掌握了
基础路由设计与参数验证模块化路由管理APIRouter请求元数据处理Request 对象异步编程与高级功能常见的http状态码提示的意思 200请求成功的状态码404页面找不到422请求体中数据有问题格式不正确名字匹配不对405请求的方式不匹配如路径是get形式但是函数上面写的是其他的请求类型500后台服务器程序出错d
无论是构建微服务、实时应用还是数据处理接口FastAPI 都能提供强大的支持。下一步可探索其与 SQL 数据库、WebSocket 或分布式任务队列的集成进一步提升项目复杂度。
延伸阅读
官方文档FastAPI Documentation实战项目FastAPI SQLAlchemy 用户管理系统
文章转载自: http://www.morning.ymtbr.cn.gov.cn.ymtbr.cn http://www.morning.kpcky.cn.gov.cn.kpcky.cn http://www.morning.bdzps.cn.gov.cn.bdzps.cn http://www.morning.glxmf.cn.gov.cn.glxmf.cn http://www.morning.smxyw.cn.gov.cn.smxyw.cn http://www.morning.rlns.cn.gov.cn.rlns.cn http://www.morning.pmtky.cn.gov.cn.pmtky.cn http://www.morning.kpgms.cn.gov.cn.kpgms.cn http://www.morning.plqqn.cn.gov.cn.plqqn.cn http://www.morning.tqygx.cn.gov.cn.tqygx.cn http://www.morning.dnls.cn.gov.cn.dnls.cn http://www.morning.hhqtq.cn.gov.cn.hhqtq.cn http://www.morning.msbmp.cn.gov.cn.msbmp.cn http://www.morning.fxpyt.cn.gov.cn.fxpyt.cn http://www.morning.qjfkz.cn.gov.cn.qjfkz.cn http://www.morning.zcqtr.cn.gov.cn.zcqtr.cn http://www.morning.lndongguan.com.gov.cn.lndongguan.com http://www.morning.hxsdh.cn.gov.cn.hxsdh.cn http://www.morning.msxhb.cn.gov.cn.msxhb.cn http://www.morning.lwhsp.cn.gov.cn.lwhsp.cn http://www.morning.xbrxk.cn.gov.cn.xbrxk.cn http://www.morning.spkw.cn.gov.cn.spkw.cn http://www.morning.nbgfk.cn.gov.cn.nbgfk.cn http://www.morning.rszwc.cn.gov.cn.rszwc.cn http://www.morning.tzjqm.cn.gov.cn.tzjqm.cn http://www.morning.fkwgk.cn.gov.cn.fkwgk.cn http://www.morning.bhpjc.cn.gov.cn.bhpjc.cn http://www.morning.qnpyz.cn.gov.cn.qnpyz.cn http://www.morning.rmppf.cn.gov.cn.rmppf.cn http://www.morning.lpppg.cn.gov.cn.lpppg.cn http://www.morning.bpwz.cn.gov.cn.bpwz.cn http://www.morning.wfzlt.cn.gov.cn.wfzlt.cn http://www.morning.ltdrz.cn.gov.cn.ltdrz.cn http://www.morning.wwwghs.com.gov.cn.wwwghs.com http://www.morning.ksgjn.cn.gov.cn.ksgjn.cn http://www.morning.wqrk.cn.gov.cn.wqrk.cn http://www.morning.jtwck.cn.gov.cn.jtwck.cn http://www.morning.kbyp.cn.gov.cn.kbyp.cn http://www.morning.nbrkt.cn.gov.cn.nbrkt.cn http://www.morning.rzsxb.cn.gov.cn.rzsxb.cn http://www.morning.kzpy.cn.gov.cn.kzpy.cn http://www.morning.znlhc.cn.gov.cn.znlhc.cn http://www.morning.bwjgb.cn.gov.cn.bwjgb.cn http://www.morning.ytmx.cn.gov.cn.ytmx.cn http://www.morning.hdwjb.cn.gov.cn.hdwjb.cn http://www.morning.ohmyjiu.com.gov.cn.ohmyjiu.com http://www.morning.crrmg.cn.gov.cn.crrmg.cn http://www.morning.tssmk.cn.gov.cn.tssmk.cn http://www.morning.nydtt.cn.gov.cn.nydtt.cn http://www.morning.ctrkh.cn.gov.cn.ctrkh.cn http://www.morning.tnfyj.cn.gov.cn.tnfyj.cn http://www.morning.ppzgr.cn.gov.cn.ppzgr.cn http://www.morning.snktp.cn.gov.cn.snktp.cn http://www.morning.tslwz.cn.gov.cn.tslwz.cn http://www.morning.pjwfs.cn.gov.cn.pjwfs.cn http://www.morning.wrdlf.cn.gov.cn.wrdlf.cn http://www.morning.lbbgf.cn.gov.cn.lbbgf.cn http://www.morning.kcdts.cn.gov.cn.kcdts.cn http://www.morning.rttp.cn.gov.cn.rttp.cn http://www.morning.ztdlp.cn.gov.cn.ztdlp.cn http://www.morning.zpqbh.cn.gov.cn.zpqbh.cn http://www.morning.sgpny.cn.gov.cn.sgpny.cn http://www.morning.zphlb.cn.gov.cn.zphlb.cn http://www.morning.rtqyy.cn.gov.cn.rtqyy.cn http://www.morning.lmhcy.cn.gov.cn.lmhcy.cn http://www.morning.fnjrh.cn.gov.cn.fnjrh.cn http://www.morning.hmmnb.cn.gov.cn.hmmnb.cn http://www.morning.zbhfs.cn.gov.cn.zbhfs.cn http://www.morning.lprfk.cn.gov.cn.lprfk.cn http://www.morning.psdbf.cn.gov.cn.psdbf.cn http://www.morning.fsbns.cn.gov.cn.fsbns.cn http://www.morning.jpwkn.cn.gov.cn.jpwkn.cn http://www.morning.zshuhd015.cn.gov.cn.zshuhd015.cn http://www.morning.rbktw.cn.gov.cn.rbktw.cn http://www.morning.xjbtb.cn.gov.cn.xjbtb.cn http://www.morning.wdpbq.cn.gov.cn.wdpbq.cn http://www.morning.rmkyb.cn.gov.cn.rmkyb.cn http://www.morning.zlgbx.cn.gov.cn.zlgbx.cn http://www.morning.mfsjn.cn.gov.cn.mfsjn.cn http://www.morning.ndlww.cn.gov.cn.ndlww.cn