Python 开发手册PYTHON

CHAPTER 06Web 后端 · WEB

Web
后端

Python 后端生态成熟。本章以 FastAPI 为主讲路由、请求模型、依赖注入、异步与中间件,并对比 Flask 的轻量范式。

开始阅读难度进阶约3小时
06.1

框架选型

FastAPI(现代、异步、自动文档)适合新项目;Flask(极简、灵活)适合小服务;Django(全家桶)适合传统全栈。

框架特点
FastAPI异步、Pydantic、OpenAPI 自动文档
Flask轻量、可组合、学习曲线低
DjangoORM/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

常见陷阱

为什么 sync DB 驱动拖慢异步接口?

在 async 路由里调用阻塞驱动会卡事件循环。要么用异步驱动,要么把阻塞调用丢到线程池(run_in_executor)。

依赖注入循环?

Depends 的依赖图不能有环;用 yields 的依赖需成对 finally 释放资源。

06.9

实战练习

延伸资源