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——以官网最新稳定版为准。
| 组件 | 版本基线 | 要点 |
|---|---|---|
| Flask | 3.x | 微框架,Python 3.8+,Werkzeug 3.x / Jinja2 3.x,生态最成熟。 |
| FastAPI | 0.115+ / 0.120+ | 基于 Starlette + Pydantic 2.x,原生异步,自动生成 Swagger 文档。 |
| Django | 5.1 / 5.2 | 全栈框架,Python 3.10+,自带 ORM / Admin / 认证 / 表单,batteries-included。 |
| Uvicorn | 0.32.x | ASGI 服务器,跑 FastAPI/Starlette 的标配;生产用 gunicorn -k uvicorn.workers.UvicornWorker。 |
| Gunicorn | 22.x | WSGI 生产服务器,跑 Flask/Django;前面再套 Nginx 反代静态文件。 |
| SQLAlchemy | 2.x | Python 最流行 ORM,2.0 起提供同步/异步统一 API,配合 Pydantic 2.x。 |
| Pydantic | 2.x | FastAPI 的数据校验底座,Rust 写的内核比 1.x 快 5-50 倍。 |
本页目录
Python Web 框架概览
Why Python Web & Framework Landscape
Flask 3.x 实战
Flask: The Micro Framework
FastAPI 实战(AI 应用首选)
FastAPI: Modern Async Web API
Django 5.x 实战
Django: Batteries Included
三框架对比与选型决策树
Which Framework to Choose
常见坑与高频面试题
Pitfalls & Interview Questions
小结 & 自测题
Web 框架这东西,别纠结语法背得熟不熟,关键是能跑起来一个完整项目。遮住答案答完这 5 题,就去动手写个自己的小站。
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 不配会拒所有请求 |
| 静态文件 collectstatic | Django 生产不自动服务静态文件 |
| 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 全开:开发 *,生产配具体域名。