Python FastAPI详解
安装Fast API:https://fastapi.tiangolo.com/zh/
FastAPI的优点:
高性能
FastAPI 基于 ASGI(异步服务器网关接口)和 Starlette 框架,支持异步编程,能够高效处理大量并发请求。其性能接近 Node.js 和 Go,比传统的 Python 框架(如 Django 和 Flask)快 3-5 倍,特别适合高并发场景。自动生成 API 文档
FastAPI 能够根据代码中的类型提示和注解自动生成交互式 API 文档(如 Swagger UI 和 ReDoc)。这不仅减少了手动编写文档的工作量,还方便了开发和调试。类型提示与数据验证
FastAPI 利用 Python 的类型提示机制和 Pydantic 库,提供强大的数据验证和序列化功能。这确保了输入数据的正确性,减少了运行时错误,并提高了代码的可读性和可维护性。异步支持
FastAPI 原生支持异步编程(async/await
),能够高效处理 I/O 密集型任务(如数据库查询、API 调用),特别适合实时数据处理和高并发场景。易于使用和学习
FastAPI 的设计注重用户体验,代码简洁易懂,支持代码自动补全和编辑器提示,降低了学习曲线,提高了开发效率。安全性
FastAPI 内置支持多种安全机制,如 OAuth2、JWT 等认证方式,并提供 HTTPS 支持,确保 API 的安全性。
Pycharm中创建FastAPI项目:
先导入FastAPI,用来定义API
-
FastAPI 是一个 Python 框架,用来创建 Web API(应用程序接口)。你可以把它想象成一个工具箱,用来搭建一个可以接收请求并返回响应的服务器。
from fastapi import FastAPI
创建FastAPI实例
-
app
是整个应用的核心,它会处理所有的请求和响应。你可以把它看作一个“服务器”,它会监听用户的请求,并根据代码的逻辑返回相应的结果。
app = FastAPI()
装饰器
-
这是一个装饰器,用来定义一个路由(route)。路由是用户访问 API 的路径。
-
@app.get("/")
表示当用户访问网站的根路径(即/
)时,会触发下面的函数。 -
/
是默认的首页路径,比如如果你的网站是http://example.com
,那么访问http://example.com/
就会触发这个路由。
@app.get("/")
异步函数
-
这是一个异步函数(
async
表示异步操作),名字叫root
。 -
异步操作是 FastAPI 的一个特性,它可以让程序在等待某些操作(比如数据库查询)时,同时处理其他请求,从而提高性能。
-
这个函数的作用是处理上面定义的
/
路由的请求。
async def root():
函数的返回值
-
这行代码是函数的返回值。
-
它返回一个字典(
{"message": "Hello World"}
),FastAPI 会自动将这个字典转换为 JSON 格式(一种常见的数据传输格式)。 -
当用户访问
/
路径时,浏览器会收到一个 JSON 响应:{"message": "Hello World"}
。
return {"message": "Hello World"}
完整代码为:
from fastapi import FastAPI # 导⼊FastAPI,⽤于定义API
app = FastAPI() # 创建FastAPI实例
@app.get("/")
async def root():return {"message": "Hello World"}
运行应用:打开终端:输入uvicorn main:app --reload
方式一:终端输入命令启动 , main是程序的名称,app 是实例化的名称,uvicorn main:app --reload
打开浏览器中,在浏览器中输入终端给的网址,http://127.0.0.1:8000,你应该能够看到 FastAPI 自动生成的交互式文档,并在根路径 ("/") 返回的 JSON 响应。
方式二:
if __name__ == '__main__':import uvicornprint(__name__)uvicorn.run("run:app", host="127.0.0.1", port=8080, reload=True)
路径操作
union类型
from typing import Union # 导⼊Union, ⽤于定义可选类型
from fastapi import FastAPI # 导⼊FastAPI,⽤于构建RESTful API
@app.gte(/items/item_id)
def read_item(x:int,y:union[str,none]=none):print("x":x,"y":y)
FastAPI 交互式 API 文档
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] = None
@app.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?q=abc
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}
if __name__ == "__main__":# 启停⽅式:# 1.⽅式1指令式:# 服务器启动指令 uvicorn main:app --reload# fastDemo1:app 表示main.py⽂件中的app实例# 服务器停⽌指令 ctrl+c# 2.⽅式2界⾯式:# ⿏标右键启动----》run main.py# 界⾯右上⻆的停⽌按钮# 启动服务,host指定主机地址,port指定端⼝号,reload=True表示当代码发⽣变化时,⾃动重启服务# main:app---- 表示main.py⽂件中的app实例uvicorn.run("fastAPIDemo3:app", host="127.0.0.1", port=8000, reload=Tr
ue)
代码块 | 作用 |
---|---|
依赖导入 | 引入框架、服务器、类型注解和数据验证库 |
应用实例化 | 创建FastAPI核心对象 |
Pydantic模型 | 定义请求体数据结构并实现自动校验 |
路由装饰器 | 绑定HTTP方法与URL路径到处理函数 |
请求处理函数 | 实现业务逻辑并返回响应 |
服务器启动 | 配置ASGI服务器参数并启动服务 |
from fastapi import FastAPI # 核心框架类
import uvicorn # ASGI服务器
from typing import Union # 类型注解工具
from pydantic import BaseModel # 数据验证库
- FastAPI:构建API的核心类。
- uvicorn:用于启动高性能ASGI服务器。
- Union:定义联合类型(如
Union[str, None]
)。 - BaseModel:创建数据模型的基类(用于请求体校验)。
app = FastAPI() # 创建FastAPI应用实例
- 核心对象:所有路由和配置的载体。
- 自动注入:后续装饰器通过
@app.get
等绑定路由。
4. 路由与请求处理
(1) 根路径GET请求
class Item(BaseModel):name: str # 必填字段,类型为字符串price: float # 必填字段,类型为浮点数is_offer: Union[bool, None] = None # 可选字段,默认为None
- 作用:定义请求体的数据结构。
- 校验规则:
name
和price
为必填字段,类型严格校验。is_offer
为可选字段,接受bool
或None
。
- 自动文档:模型结构会显示在Swagger UI中。
(2) 带路径参数的GET请求
@app.get("/")
async def read_root():return {"Hello": "World"}
- 路径:
http://localhost:8000/
- 行为:返回固定JSON响应。
- 异步支持:
async
声明使函数支持异步处理。
(3) 带请求体的PUT请求
@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):return {"item_name": item.name, "item_id": item_id}
- 请求体校验:
item
参数必须是符合Item
模型的JSON。 - 自动解析:FastAPI将JSON请求体转换为
Item
对象。
if __name__ == "__main__":uvicorn.run("fastAPIDemo3:app", host="127.0.0.1", port=8000, reload=True)
- 模块定位:
fastAPIDemo3:app
表示fastAPIDemo3.py
文件中的app
实例。 - 参数说明:
host
:绑定到本地回环地址。port
:监听8000端口。reload
:开发模式下自动重载代码变更。
- 启动方式:
- 直接运行脚本(
python main.py
)。 - 命令行指令:
uvicorn main:app --reload
。
- 直接运行脚本(