06.1
框架选型
FastAPI(现代、异步、自动文档)适合新项目;Flask(极简、灵活)适合小服务;Django(全家桶)适合传统全栈。
| 框架 | 特点 |
|---|---|
| FastAPI | 异步、Pydantic、OpenAPI 自动文档 |
| Flask | 轻量、可组合、学习曲线低 |
| Django | ORM/Admin/Auth 一体化 |
06.2
FastAPI 入门
用装饰器声明路径与 HTTP 方法,函数参数即路径/查询参数,返回自动序列化为 JSON。
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}")
def get_user(user_id: int, q: str | None = None):
return {"id": user_id, "q": q}06.3
请求模型
用 Pydantic 模型声明请求体,自动校验类型并生成文档,错误返回结构化 422。
from pydantic import BaseModel
class CreateUser(BaseModel):
name: str
age: int
@app.post("/users")
def create(u: CreateUser):
return {"created": u.name, "age": u.age}06.4
依赖注入
FastAPI 的 Depends 把可复用逻辑(鉴权、DB 连接)注入到路由,自动解析与嵌套。
from fastapi import Depends
def get_db():
db = Session()
try: yield db
finally: db.close()
@app.get("/me")
def me(db = Depends(get_db)):
return db.query(User).first()06.5
异步与并发
路由用 async def 即可在 IO 等待时让出事件循环,配合 async DB 驱动(如 asyncpg/SQLAlchemy 2.0 async)。
@app.get("/async")
async def fetch():
data = await httpx.AsyncClient().get(url)
return data.json()06.6
中间件与异常
中间件统一处理日志/耗时/CORS;用 HTTPException 返回受控错误。
from fastapi import HTTPException
@app.get("/admin")
def admin():
raise HTTPException(status_code=403, detail="无权限")06.7
ORM 持久化
SQLAlchemy 声明模型与表映射,Session 管理事务;2.0 风格支持 async。
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String)06.8
常见陷阱
在 async 路由里调用阻塞驱动会卡事件循环。要么用异步驱动,要么把阻塞调用丢到线程池(run_in_executor)。
Depends 的依赖图不能有环;用 yields 的依赖需成对 finally 释放资源。
06.9