>>>PyPathPython 学习站
前沿与实践 · Frontier & Practice lv.4 前沿 kp-042

Web 生态(FastAPI/Flask/Django)

前置知识:kp-022、kp-031

1. 一句话定义

Python Web 三巨头按抽象层级排列:Flask(微框架:路由 + 请求对象,其余自选)、FastAPI(现代 API 框架:类型注解驱动 + 异步 + 自动文档)、Django(全家桶:ORM/后台/认证/模板自带)。

2. 为什么重要

Web 后端是 Python 的第二大主场。三者的取舍是"要多少现成结构"的取舍——理解这一坐标轴,遇到任何新框架(Litestar、Sanic…)都能定位。

3. 前置知识

kp-020(Pydantic)、kp-031(asyncio)、kp-022(http.server 的对照)。

4. 核心概念

python
# FastAPI(API 服务首选示例)
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class BookIn(BaseModel):
    title: str
    price: float

@app.get("/books/{book_id}")
def get_book(book_id: int):                    # 类型注解 → 自动校验路径参数
    return {"id": book_id}

@app.post("/books")
async def create(book: BookIn):                # 请求体自动模型化
    return book
# 运行:uvicorn main:app --reload   → 自动文档 /docs

text
三巨头定位:
  Flask    微框架,同步为主,小服务/原型/教学,插件自由拼装
  FastAPI  API 服务,异步+Pydantic 校验+OpenAPI 文档自动生成
  Django   全功能,ORM+Admin+Auth+迁移,内容型/多页面站点的快车道
底层协议:WSGI(同步,Flask/Django 传统)→ ASGI(异步,FastAPI/Django 3.0+)

5. 原理与机制

text
请求的一生(ASGI/FastAPI 视角):
  uvicorn(ASGI 服务器)收 HTTP
    → 路由匹配 → 依赖注入(Depends)
    → Pydantic 校验请求体/参数(类型注解即校验规则,kp-020/026)
    → 执行端点函数(async 或线程池桥接同步函数)
    → 返回值序列化 → 响应
OpenAPI schema 由类型信息自动生成(/docs 交互文档)

同步 vs 异步端点:def 端点由框架丢进线程池(安全但受池上限);async def 跑在事件循环(kp-031 铁律:内部不得阻塞)。

6. 关键事实(模型/图示)

text
选型速查:
  纯 REST/JSON API、要类型与文档     → FastAPI
  传统多页面站、要后台管理/ORM       → Django
  极小服务、教学、要最大自由          → Flask
  全都需要 asyncio + 高并发网关      → FastAPI/Litestar

7. 直观类比

Flask 是空白毛坯房(水电自己接,位置随你);FastAPI 是精装修公寓(水电到位、家具有清单、说明书自动生成——类型注解就是那份合同);Django 是带物业的成熟小区(从幼儿园(Admin)到健身房(Auth)全配,省心但按小区规矩来)。

8. 实例与案例

python
# 一个带鉴权依赖的 FastAPI 端点
from fastapi import Depends, HTTPException

def current_user(token: str = Depends(parse_token)) -> User: ...

@app.get("/me")
def me(user: User = Depends(current_user)):
    return user

Depends 的依赖注入让鉴权/分页/数据库会话成为可复用、可测试的单元。

9. 常见误区

  1. async def 端点里调同步库 —— 冻住事件循环(kp-031 铁律的 Web 版);同步 ORM/驱动配 def 端点即可。
  2. 在业务逻辑里直接操作 request 全局状态 —— 依赖注入(Depends)才是可测试的通道。
  3. 以为 FastAPI 快是"框架快" —— 单请求延迟差别有限;并发吞吐优势来自异步模型,瓶颈常在数据库。
  4. Django 项目硬上 async 视图 —— ORM 异步化有边界,混用需了解 sync_to_async 桥接。

10. 自测题

  1. FastAPI 如何从函数签名得到校验规则与文档?
  2. def 与 async def 端点在框架内的执行差异?
  3. 什么时候不该选 Django?
参考答案
  1. Pydantic 读取类型注解做请求校验;OpenAPI schema 由同一份类型信息生成(/docs 可交互)。
  2. async def 在事件循环直接执行(内部必须全异步);def 被放入线程池执行(可安全调用阻塞代码,但并发受池大小限制)。
  3. 纯 API 服务、微服务、需要极致灵活技术栈时——Django 的"全家桶"结构此时是负担。

11. 与其他知识点的关系

  • kp-020 Pydantic:请求/响应模型层。
  • kp-031 asyncio:ASGI 的执行底座。
  • kp-037 日志:生产 Web 服务的可观测性配套。

12. 延伸阅读

  • FastAPI 官方文档:https://fastapi.tiangolo.com/zh/
  • Django Tutorial(官方 Polls 教程仍是最快入门)