Python Web · Flask 3 / FastAPI / Django 5

Python 写 Web,开发快、生态全,特别适合快速原型和 AI 应用后端。这一页把三大框架一次讲透:Flask 微框架灵活,FastAPI 现代异步自动文档(AI 应用首选),Django 全栈自带 Admin。版本基线:Flask 3.x、FastAPI 0.115+、Django 5.1/5.2、SQLAlchemy 2.x、Pydantic 2.x、Uvicorn 0.32.x——以官网最新稳定版为准。

最新版本与兼容性(以 PyPI / 官网最新稳定版为准)
组件版本基线要点
Flask3.x微框架,Python 3.8+,Werkzeug 3.x / Jinja2 3.x,生态最成熟。
FastAPI0.115+ / 0.120+基于 Starlette + Pydantic 2.x,原生异步,自动生成 Swagger 文档。
Django5.1 / 5.2全栈框架,Python 3.10+,自带 ORM / Admin / 认证 / 表单,batteries-included。
Uvicorn0.32.xASGI 服务器,跑 FastAPI/Starlette 的标配;生产用 gunicorn -k uvicorn.workers.UvicornWorker。
Gunicorn22.xWSGI 生产服务器,跑 Flask/Django;前面再套 Nginx 反代静态文件。
SQLAlchemy2.xPython 最流行 ORM,2.0 起提供同步/异步统一 API,配合 Pydantic 2.x。
Pydantic2.xFastAPI 的数据校验底座,Rust 写的内核比 1.x 快 5-50 倍。
测

小结 & 自测题

Summary & Quiz

Web 框架这东西,别纠结语法背得熟不熟,关键是能跑起来一个完整项目。遮住答案答完这 5 题,就去动手写个自己的小站。

自测 · Python Web

1.(选型题)老板让你一周内做一个"带后台管理、能发文章、要上线"的内容站,选 Flask、FastAPI 还是 Django?

查看答案

答案:Django。解析:要"后台管理"+"一周交付",Django 的 Admin 自动生成后台,ORM/认证/表单全自带,不用自己拼。FastAPI 适合纯 API,Flask 要自己选插件拼后台。

2.(概念题)为什么生产环境不能用 flask run 或 runserver?

查看答案

答案:开发服务器单线程、无性能优化、DEBUG 模式会暴露代码和环境变量。生产要用 Gunicorn/Uvicorn 多 worker,前面套 Nginx,关 DEBUG。

3.(概念题)FastAPI 写了 async def,里面调了 requests.get(),为什么反而更慢?

查看答案

答案:requests.get() 是阻塞调用,会卡住整个事件循环,其他异步任务全停摆。要换 aiohttp/httpx.AsyncClient,或者改成普通 def 让 FastAPI 自动丢线程池。

4.(安全题)用户在评论框输入 <script>alert(1)</script>,怎么防止它在别人浏览器执行?

查看答案

答案:XSS 防护:模板默认自动转义(Jinja2/DTL 都会把 < > 转成实体),别手贱用 |safe。输出时按上下文转义,CSP 头兜底。

5.(思考题)要做一个"AI 对话"后端,前端要流式打字效果,你选哪个框架?用什么技术实现流式?

查看答案

答案:FastAPI。用 SSE(Server-Sent Events)——FastAPI 返回 StreamingResponse(media_type="text/event-stream"),后端 async for chunk in llm.stream() 逐 token yield,前端 EventSource 接收逐字显示。WebSocket 也行,但 SSE 更简单(单向、自动重连)。

下
下一步去哪

① 动手:用 FastAPI 把你常用的一个脚本包成 API。

② 部署:用 Docker + Gunicorn + Nginx 部署到一台小 VPS。

③ 配套:下一页 Python 爬虫技术——数据是 Web 的上游,爬虫是拿数据的手艺。

论三个月学习路线

第 1-2 周:Flask hello world → 路由/模板/表单 → 写个博客。第 3-4 周:FastAPI hello world → Pydantic/依赖注入 → 写个带认证的 API。第 5-6 周:Django startproject → ORM/Admin → 写个 CMS。第 7-8 周:选一个框架深入,接数据库、部署上线。别三个框架同时学——先精通一个,另两个触类旁通。

面试重点:WSGI vs ASGI、GIL、中间件执行顺序、RESTful 设计、JWT vs Session、SQL 注入/XSS/CSRF、N+1 查询。这些高频考点前面章节都覆盖了,遮住答案答一遍。

实战建议:学完别只看不练,跟着每章的案例代码手敲一遍,跑通了再自己改。Web 框架是"做出来"的,不是"看出来"的。

下一站:去 tech-python-crawler.html,学怎么用 Python 爬数据。Web 和爬虫是黄金搭档——Web 做接口,爬虫抓数据。

部署上线 Checklist

检查项为什么
DEBUG=False开着 DEBUG 上线 = 泄露源码
SECRET_KEY 改了默认密钥谁都能伪造 Session
ALLOWED_HOSTS 配了Django 不配会拒所有请求
静态文件 collectstaticDjango 生产不自动服务静态文件
HTTPS 证书HTTP 传密码裸奔
数据库连接池高并发不连池会拖垮 DB
日志配置生产必须记错误日志,出问题好查
数据库迁移改了模型要跑 migrate,别直接改表
请求体大小限制防大文件上传拖垮服务器
限流 Rate Limit防暴力刷接口
异常页面对应404/500 自定义错误页
数据库索引WHERE/JOIN 字段加索引,别全表扫
环境变量密钥/数据库密码别写代码里,用环境变量
备份数据库上线前先备份,改坏了能回滚
进程守护Gunicorn 挂了自动重启(systemd/supervisor)
监控告警5xx 率、响应时间告警
HTTPS 强制跳转HTTP 自动跳 HTTPS
安全响应头HSTS/X-Frame-Options/CSP
速率限制防接口被刷爆
数据库慢查询日志找出拖慢接口的 SQL
CDN 静态资源图片/JS/CSS 走 CDN 减轻源站压力
读写分离读多写少,读走从库
缓存热点数据缓存到 Redis,别每次查库
异步任务队列发邮件/生成报告扔 Celery,别阻塞请求
数据库连接数别每个请求开一个连接,用连接池
大文件流式上传别一次性读进内存,用流式
SQL 注入防护ORM 参数化,别拼字符串
XSS 防护模板自动转义,别用 |safe
CSRF 防护表单带 CSRF token,API 用 JWT
密码哈希bcrypt/werkzeug,别明文
JWT 过期时间access token 短(15分钟),refresh 长
接口版本/api/v1/,升级不破坏老客户端
分页别一次返回 10 万条,page/size
字段过滤返回数据只给前端需要的字段,别全量
响应缓存GET 接口加 ETag/Last-Modified
压测上线前用 locust/wrk 压一下,看瓶颈
灰度发布先给 10% 用户新版本,没问题再全量
回滚方案新版本出问题,一键回老版本
文档API 文档(FastAPI 自动生成)+ 部署文档
测试单元测试 + 集成测试,CI 自动跑
代码规范black/ruff 统一风格,别各写各的
Git 管理分支管理,别直接 main 上改
依赖锁定requirements.txt / poetry.lock,别 pip install 最新版
虚拟环境每个项目独立 venv,别全局装包
README怎么装、怎么跑、怎么部署,写清楚
代码评审PR 至少两人 review 再合并
LICENSE开源项目记得加许可证
.gitignore别把 .env / venv / __pycache__ 提交上去
Docker容器化部署,环境一致
K8s大规模部署用 Kubernetes 编排
监控面板Grafana 看 QPS/延迟/错误率

论新手最常踩的坑

① 把开发服务器当生产:flask run / runserver 只开发用,上线必须 Gunicorn+Nginx。② 密码明文存:用 werkzeug/bcrypt/django hash,永远别 password = "123"。③ SQL 拼接:用 ORM 参数化,别 f"WHERE name='{name}'"。④ CORS 全开:开发 *,生产配具体域名。