基础
FastAPI 是一个现代的、快速的 Web 框架,用于构建 APIs,具有以下特点:
- 高性能:基于 Python 的异步功能,FastAPI 的性能接近于 Node.js 和 Go。
- 易用性:设计上简洁优雅,支持类型注解,开发者体验非常好。
- 自动生成文档:基于类型提示自动生成交互式 API 文档(Swagger UI 和 ReDoc)。
- 异步支持:原生支持
async
和await
,轻松构建高并发的异步 API。 - 数据验证:使用 Pydantic 进行数据验证和解析。
1. FastAPI 概念¶
1.1 请求和响应模型¶
- 请求:客户端发送数据到服务器,通常通过 GET、POST、PUT、DELETE 等 HTTP 方法。
- 响应:服务器处理请求并返回数据,通常为 JSON 格式。
1.2 路由(Routing)¶
路由是将 URL 路径映射到特定的处理函数。FastAPI 提供了简洁的路由定义方式,通过 Python 函数直接绑定到路由。
1.3 数据模型(Pydantic)¶
FastAPI 使用 Pydantic 进行数据模型定义和验证。Pydantic 支持基于类型注解的自动数据验证。
1.4 依赖注入(Dependency Injection)¶
FastAPI 支持依赖注入,通过函数参数的形式将依赖传递给路由处理函数。它允许开发者轻松管理复杂的依赖关系。
2. 快速上手:构建一个简单的 FastAPI 应用¶
2.1 创建应用程序¶
首先,创建一个最基本的 FastAPI 应用。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello, World!"}
这里我们定义了一个 FastAPI 实例 app
,并使用 @app.get("/")
装饰器定义了一个 GET 请求的处理函数 read_root
。
2.2 启动应用¶
使用 Uvicorn 启动 FastAPI 应用:
main
是指文件名main.py
。app
是 FastAPI 实例的名字。--reload
启用自动重载,代码更新时服务器会自动重启。
打开浏览器访问 http://127.0.0.1:8000/
,你会看到一个简单的 JSON 响应 {"message": "Hello, World!"}
。
2.3 路由和路径参数¶
我们可以定义更多的路由,并使用路径参数来处理动态 URL。
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
item_id
是路径参数,q
是查询参数(带默认值)。
访问 http://127.0.0.1:8000/items/42?q=foo
,响应将是 {"item_id": 42, "q": "foo"}
。
2.4 数据模型与请求体¶
使用 Pydantic 定义数据模型,并在请求体中接收 JSON 数据。
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.post("/items/")
async def create_item(item: Item):
return {"item": item}
Item
是一个 Pydantic 模型,用于验证请求体数据。- 使用
@app.post("/items/")
定义了一个 POST 路由,接收Item
类型的数据。
发送 POST 请求到 http://127.0.0.1:8000/items/
,携带 JSON 数据 {"name": "Book", "price": 12.5}
,服务器将返回接收的对象。
2.5 依赖注入¶
依赖注入允许将依赖的组件或配置注入到路由处理函数中。
from fastapi import Depends
def get_query(q: str = None):
return q
@app.get("/items/")
async def read_items(q: str = Depends(get_query)):
return {"q": q}
get_query
是一个依赖函数,Depends
负责将其注入到路由函数中。
2.6 自动生成文档¶
FastAPI 自动生成 API 文档,提供交互式界面:
- Swagger UI:
http://127.0.0.1:8000/docs
- ReDoc:
http://127.0.0.1:8000/redoc
3. 更高级的操作¶
3.1 中间件(Middleware)¶
中间件是一个处理请求和响应的钩子,可以用于请求日志记录、跨域处理等。
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
3.2 异步任务(Background Tasks)¶
FastAPI 支持后台任务,可以在响应返回后继续执行长时间运行的任务。
from fastapi import BackgroundTasks
def write_log(message: str):
with open("log.txt", "a") as log:
log.write(message)
@app.post("/log/")
async def create_log(message: str, background_tasks: BackgroundTasks):
background_tasks.add_task(write_log, message)
return {"message": "Log will be written"}
3.3 WebSockets¶
FastAPI 原生支持 WebSockets,可以轻松构建实时通信的应用。
from fastapi import WebSocket
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Message text was: {data}")
4. 部署 FastAPI 应用¶
FastAPI 可以在多个环境中部署:
- 使用 Uvicorn:适合开发和小型应用。
- 使用 Gunicorn + Uvicorn:适合生产环境,支持多个工作进程。
- 容器化部署:使用 Docker 将应用容器化,方便在各种环境中部署。
总结¶
FastAPI 是一个强大而灵活的 Web 框架,它结合了类型提示、自动文档生成、异步支持等现代特性,使得开发高性能、高可维护性的 API 变得更加容易。通过本文的学习,你应该对 FastAPI 的基本概念、路由、数据模型、依赖注入等有了深入的理解。