前沿与实践 · Frontier & Practice
lv.4 前沿
kp-042
Web 生态(FastAPI/Flask/Django)
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 → 自动文档 /docstext
三巨头定位:
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/Litestar7. 直观类比
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 userDepends 的依赖注入让鉴权/分页/数据库会话成为可复用、可测试的单元。
9. 常见误区
- async def 端点里调同步库 —— 冻住事件循环(kp-031 铁律的 Web 版);同步 ORM/驱动配
def端点即可。 - 在业务逻辑里直接操作 request 全局状态 —— 依赖注入(Depends)才是可测试的通道。
- 以为 FastAPI 快是"框架快" —— 单请求延迟差别有限;并发吞吐优势来自异步模型,瓶颈常在数据库。
- Django 项目硬上 async 视图 —— ORM 异步化有边界,混用需了解
sync_to_async桥接。
10. 自测题
- FastAPI 如何从函数签名得到校验规则与文档?
def与async def端点在框架内的执行差异?- 什么时候不该选 Django?
参考答案
- Pydantic 读取类型注解做请求校验;OpenAPI schema 由同一份类型信息生成(/docs 可交互)。
- async def 在事件循环直接执行(内部必须全异步);def 被放入线程池执行(可安全调用阻塞代码,但并发受池大小限制)。
- 纯 API 服务、微服务、需要极致灵活技术栈时——Django 的"全家桶"结构此时是负担。
11. 与其他知识点的关系
12. 延伸阅读
- FastAPI 官方文档:https://fastapi.tiangolo.com/zh/
- Django Tutorial(官方 Polls 教程仍是最快入门)