1. 引言
Python 之所以在 Web 开发领域占据重要地位,离不开其丰富且成熟的 Web 框架生态。在众多框架中,Django 、Flask 和 FastAPI 是最具代表性的三个,它们分别代表了「大而全」「小而精」和「快而新」三种不同的设计哲学。
对于初学者来说,面对这三个框架常常会感到困惑:到底该学哪个?项目选型时又该如何抉择?本文将从设计理念、核心特性、性能表现、适用场景等多个维度,对三大框架进行系统性的对比解析,帮助你建立清晰的认知,做出合适的技术选型。
2. 三大框架概览
在深入对比之前,我们先对三个框架做一个整体性的认识。
2.1 Django:大而全的「全家桶」
Django 诞生于 2005 年,最初用于新闻网站的内容管理,后于 2008 年发布为开源项目。它遵循 「Batteries included」(自带电池) 的理念,内置了 ORM、Admin 后台、认证系统、表单处理、模板引擎等几乎所有 Web 开发所需的组件。
python
# Django 的 MTV 架构示例:模型定义
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
2.2 Flask:小而精的「微框架」
Flask 诞生于 2010 年,基于 Werkzeug 和 Jinja2 构建。它只提供最核心的路由、请求响应处理能力,其余功能(数据库、表单、认证等)都通过扩展(Extension)按需集成。这种「微内核 + 插件」的设计让 Flask 极其轻量灵活。
python
# Flask 最小应用示例
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, Flask!"
2.3 FastAPI:快而新的「异步新贵」
FastAPI 发布于 2018 年,基于 Starlette 和 Pydantic 构建。它充分利用 Python 3.6+ 的类型提示(Type Hints)和异步(async/await)特性,自动生成 OpenAPI 文档,并以极高的性能著称。
python
# FastAPI 最小应用示例
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def hello():
return {"message": "Hello, FastAPI!"}
3. 核心特性详细对比
3.1 路由与请求处理
| 框架 | 路由定义方式 | 请求参数获取 | 响应返回 |
|---|---|---|---|
| Django | urls.py 集中配置 + 正则/路径转换器 |
函数参数 + request 对象 |
HttpResponse / JsonResponse |
| Flask | 装饰器 @app.route() |
request.args / request.json |
return 字符串 / jsonify() |
| FastAPI | 装饰器 @app.get() / @app.post() |
函数参数 + 类型声明 | 任意 Python 对象自动转 JSON |
Django 路由示例:
python
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path("articles/<int:article_id>/", views.article_detail),
]
Flask 路由示例:
python
@app.route("/articles/<int:article_id>/")
def article_detail(article_id):
return f"Article ID: {article_id}"
FastAPI 路由示例:
python
@app.get("/articles/{article_id}")
async def article_detail(article_id: int):
return {"article_id": article_id}
3.2 数据持久化(ORM)
这是三者差异最大的领域之一。
Django ORM:内置完整 ORM,支持模型定义、迁移(Migration)、查询集(QuerySet)链式操作,开箱即用。
python
# Django ORM 查询示例
articles = Article.objects.filter(status="published").order_by("-created_at")[:10]
Flask:本身不含 ORM,通常搭配 SQLAlchemy 使用。
python
# Flask + SQLAlchemy 示例
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200))
FastAPI:本身不含 ORM,官方推荐 SQLAlchemy 或 Tortoise ORM,同时支持异步 ORM。
python
# FastAPI + SQLAlchemy 异步示例
from sqlalchemy.ext.asyncio import create_async_engine
engine = create_async_engine("sqlite+aiosqlite:///./test.db")
3.3 模板渲染
| 框架 | 模板引擎 | 特点 |
|---|---|---|
| Django | 内置 Django Template Language(DTL) | 语法简洁,自带安全转义 |
| Flask | Jinja2 | 功能强大,支持继承与宏 |
| FastAPI | 无内置,可配 Jinja2 | 更偏向返回 JSON,模板非核心 |
3.4 表单与数据校验
Django:内置 Form 和 ModelForm,自动处理表单渲染、校验和错误提示。
Flask:需借助 WTForms 扩展。
FastAPI:基于 Pydantic 实现声明式数据校验,这是其最大亮点之一。
python
from pydantic import BaseModel
class ArticleCreate(BaseModel):
title: str
content: str
tags: list[str] = []
@app.post("/articles/")
async def create_article(article: ArticleCreate):
# 自动完成数据校验
return {"title": article.title}
3.5 认证与权限
下面分别给出三个框架最小可运行的认证与权限控制示例,帮助你快速理解各自的实现思路。
Django:login_required 装饰器
Django 内置完整的认证系统,只需在视图函数上添加 login_required 装饰器,即可要求用户登录后才能访问。未登录的请求会被重定向到登录页(默认 /accounts/login/):
python
# views.py
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
@login_required # 未登录则重定向到登录页
def profile(request):
# 登录后可通过 request.user 获取当前用户
return JsonResponse({"username": request.user.username})
核心思路:装饰器在视图执行前检查 request.user.is_authenticated,未通过则拦截并重定向,实现简单直接。
Flask:Flask-Login 登录保护
Flask 本身不含认证组件,通常借助 Flask-Login 扩展。核心是 login_required 装饰器 + current_user 全局对象:
python
from flask import Flask, redirect, url_for
from flask_login import LoginManager, login_required, current_user
app = Flask(__name__)
app.secret_key = "your-secret-key"
login_manager = LoginManager(app)
login_manager.login_view = "login" # 未登录时跳转到登录视图
@app.route("/profile")
@login_required # 未登录则重定向到登录页
def profile():
# 通过 current_user 获取当前登录用户
return f"Hello, {current_user.username}!"
核心思路:Flask-Login 通过 session 管理登录态,login_required 装饰器拦截未认证请求,current_user 提供当前用户访问入口。
FastAPI:OAuth2 密码流依赖注入
FastAPI 没有内置认证,但通过依赖注入(Dependency Injection)机制可以优雅地实现 OAuth2 密码流认证。核心是 OAuth2PasswordBearer + 自定义依赖函数:
python
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
# 声明 token 获取地址(/token 用于换取 access_token)
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# 自定义认证依赖:校验 token 并返回当前用户
async def get_current_user(token: str = Depends(oauth2_scheme)):
# 实际项目中应在此解析并校验 JWT,这里仅作演示
if token != "valid-token":
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="无效的认证凭据",
)
return {"username": "demo_user"}
@app.get("/profile")
async def profile(user: dict = Depends(get_current_user)):
# 只有通过认证的请求才能到达这里
return {"username": user["username"]}
核心思路:OAuth2PasswordBearer 从请求头提取 token,get_current_user 作为依赖校验 token 并返回用户信息,视图通过 Depends 声明依赖,未通过认证则自动返回 401。
小结: Django 的认证最「开箱即用」,一个装饰器即可搞定;Flask 借助 Flask-Login 实现会话式登录,轻量直观;FastAPI 则通过依赖注入实现高度可定制的 token 认证,更契合现代 API 场景。
3.6 安全特性对比
Web 安全是每个框架都必须重视的课题。下面从 SQL 注入、XSS、CSRF、点击劫持四个维度,对比三大框架的内置能力与配置方式:
| 安全维度 | Django | Flask | FastAPI |
|---|---|---|---|
| SQL 注入防护 | ORM 参数化查询,天然免疫 | 需使用 SQLAlchemy 参数化 | 需使用 SQLAlchemy 参数化 |
| XSS 防护 | DTL 模板自动转义 | Jinja2 默认转义 | 返回 JSON,天然规避 |
| CSRF 防护 | 内置 CSRF 中间件 | 需 Flask-WTF / Flask-Security | 无内置,需自行实现 |
| 点击劫持防护 | 内置 X-Frame-Options 中间件 |
需 Flask-Talisman | 需自定义中间件 |
Django 的 CSRF 中间件:
Django 默认开启 CSRF 防护,只需在模板表单中加入 {% csrf_token %},并在 settings.py 中确认中间件已启用:
python
# settings.py
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.middleware.csrf.CsrfViewMiddleware", # CSRF 防护
"django.middleware.clickjacking.XFrameOptionsMiddleware", # 点击劫持防护
]
html
<!-- 模板中的表单 -->
<form method="post">
{% csrf_token %}
<input type="text" name="title">
<button type="submit">提交</button>
</form>
Flask 的 Flask-Security 扩展:
Flask 本身不内置安全组件,推荐使用 Flask-Security 统一管理 CSRF、会话保护和密码哈希:
python
from flask import Flask
from flask_security import Security, SQLAlchemyUserDatastore
from flask_wtf.csrf import CSRFProtect
app = Flask(__name__)
app.config["SECRET_KEY"] = "your-secret-key"
app.config["WTF_CSRF_ENABLED"] = True # 开启 CSRF 防护
csrf = CSRFProtect(app) # 全局 CSRF 防护
# 启用 Flask-Security(含会话保护、密码哈希等)
# security = Security(app, user_datastore)
FastAPI 的依赖注入安全示例:
FastAPI 没有内置 CSRF 中间件,但可以利用依赖注入(Dependency Injection)机制,自定义安全校验逻辑:
python
from fastapi import FastAPI, Depends, HTTPException, Header
app = FastAPI()
# 自定义 CSRF 校验依赖
async def verify_csrf(x_csrf_token: str = Header(...)):
expected_token = "your-csrf-token"
if x_csrf_token != expected_token:
raise HTTPException(status_code=403, detail="CSRF 校验失败")
@app.post("/articles/", dependencies=[Depends(verify_csrf)])
async def create_article():
# 只有通过 CSRF 校验的请求才能到达这里
return {"status": "created"}
小结: Django 在安全防护上最「省心」,开箱即用;Flask 需要借助扩展补齐;FastAPI 则更依赖开发者通过依赖注入等方式自行构建安全层,但这也带来了更高的灵活性。
- Django:内置完整的认证系统,包括用户模型、会话、权限、Admin 后台。
- Flask:需集成 Flask-Login、Flask-JWT-Extended 等扩展。
- FastAPI:需集成 OAuth2、JWT 等方案,官方文档提供了完善的教程。
3.7 Admin 后台
- Django:自带功能强大的 Admin 后台,只需注册模型即可获得增删改查界面。
- Flask:需借助 Flask-Admin 扩展。
- FastAPI:无内置 Admin,需自行开发或使用第三方库。
4. 性能对比
4.1 同步 vs 异步
这是三者性能差异的根源:
| 框架 | 并发模型 | 适用场景 |
|---|---|---|
| Django | 同步(WSGI),3.1+ 支持异步视图 | 传统 IO 密集型业务 |
| Flask | 同步(WSGI) | 中小型应用 |
| FastAPI | 异步(ASGI),原生 async/await | 高并发、IO 密集型 |
4.2 基准测试参考
在常见的 Hello World 基准测试中,三者的大致表现(数值因环境而异,仅作量级参考):
FastAPI(异步) > Flask > Django
模拟测试场景: 假设我们分别用三个框架实现一个返回 JSON 的 /api/hello 接口,使用 wrk 压测工具模拟 1000 个并发连接 、持续 30 秒 的请求压力,测试环境为 4 核 8G 的 Linux 服务器(Python 3.11,Gunicorn/Uvicorn 各 4 个 worker)。以下是模拟测试数据:
| 框架 | 部署方式 | 平均响应时间(ms) | 吞吐量(req/s) | 错误率 |
|---|---|---|---|---|
| Django | Gunicorn + 同步 worker | 45.2 | 2,180 | 0.00% |
| Flask | Gunicorn + 同步 worker | 38.7 | 2,560 | 0.00% |
| FastAPI | Uvicorn + 异步 worker | 12.4 | 7,890 | 0.00% |
说明:以上为模拟数据,仅用于直观展示三者在大并发下的量级差异。实际数值会因硬件配置、代码实现、网络环境等因素而不同,建议在真实业务场景中自行压测验证。
wrk 压测命令示例:
bash
# 安装 wrk
brew install wrk # macOS
sudo apt install wrk # Ubuntu/Debian
# 对三个框架分别执行压测
wrk -t4 -c1000 -d30s http://localhost:8000/api/hello
FastAPI 得益于异步非阻塞模型,在高并发场景下吞吐量通常显著优于同步框架。但需要注意:实际性能瓶颈往往在数据库和业务逻辑,而非框架本身。
4.3 性能优化建议
- Django :使用
select_related/prefetch_related减少查询次数;引入缓存(Redis/Memcached)。 - Flask:配合 Gunicorn 多进程部署;对耗时操作使用 Celery 异步化。
- FastAPI:充分利用 async/await;数据库连接使用连接池;配合 Uvicorn 多 worker 部署。
5. 开发效率与学习曲线
5.1 学习曲线对比
Django(陡峭) > Flask(平缓) > FastAPI(适中)
- Django:概念多(MTV、ORM、Admin、中间件),但一旦掌握,开发效率极高。
- Flask:上手快,但自由度过高,架构设计需要自己把握。
- FastAPI:需要理解类型提示和异步编程,但文档极佳,官方教程完善。
5.2 开发效率对比
| 场景 | Django | Flask | FastAPI |
|---|---|---|---|
| 快速搭建原型 | 快(自带组件多) | 快(轻量) | 快(自动文档) |
| 大型项目 | 极高(规范统一) | 中(需自行规范) | 高(类型安全) |
| API 开发 | 中 | 中 | 极高(自动文档) |
6. 生态与社区
6.1 生态成熟度
- Django:生态最成熟,第三方包丰富,社区庞大,企业级应用广泛。
- Flask:生态成熟,扩展众多,适合中小型项目和微服务。
- FastAPI:生态快速成长,虽年轻但发展迅猛,异步生态日益完善。
6.2 学习资源
- Django:官方文档详尽,书籍和教程众多,社区问答丰富。
- Flask:官方文档清晰,入门教程多,适合初学者。
- FastAPI:官方文档被誉为「最好的框架文档之一」,教程质量极高。
7. 适用场景与选型建议
7.1 选型决策流程图
#mermaid-svg-ZRGyWpdVH9jZqmIJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .error-icon{fill:#552222;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .marker.cross{stroke:#333333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZRGyWpdVH9jZqmIJ p{margin:0;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .cluster-label text{fill:#333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .cluster-label span{color:#333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .cluster-label span p{background-color:transparent;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .label text,#mermaid-svg-ZRGyWpdVH9jZqmIJ span{fill:#333;color:#333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .node rect,#mermaid-svg-ZRGyWpdVH9jZqmIJ .node circle,#mermaid-svg-ZRGyWpdVH9jZqmIJ .node ellipse,#mermaid-svg-ZRGyWpdVH9jZqmIJ .node polygon,#mermaid-svg-ZRGyWpdVH9jZqmIJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .rough-node .label text,#mermaid-svg-ZRGyWpdVH9jZqmIJ .node .label text,#mermaid-svg-ZRGyWpdVH9jZqmIJ .image-shape .label,#mermaid-svg-ZRGyWpdVH9jZqmIJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .rough-node .label,#mermaid-svg-ZRGyWpdVH9jZqmIJ .node .label,#mermaid-svg-ZRGyWpdVH9jZqmIJ .image-shape .label,#mermaid-svg-ZRGyWpdVH9jZqmIJ .icon-shape .label{text-align:center;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .node.clickable{cursor:pointer;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .arrowheadPath{fill:#333333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZRGyWpdVH9jZqmIJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZRGyWpdVH9jZqmIJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZRGyWpdVH9jZqmIJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .cluster text{fill:#333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .cluster span{color:#333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZRGyWpdVH9jZqmIJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .icon-shape,#mermaid-svg-ZRGyWpdVH9jZqmIJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .icon-shape p,#mermaid-svg-ZRGyWpdVH9jZqmIJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .icon-shape .label rect,#mermaid-svg-ZRGyWpdVH9jZqmIJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZRGyWpdVH9jZqmIJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZRGyWpdVH9jZqmIJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZRGyWpdVH9jZqmIJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
大型
中小型
项目需求分析
是否需要 Admin 后台?
Django
是否需要高并发?
FastAPI
项目规模?
Django
Flask
7.2 各框架最佳适用场景
选择 Django 的场景:
- 内容管理系统(CMS)
- 电商平台
- 社交网络
- 需要快速交付且功能全面的企业应用
- 需要内置 Admin 后台的管理系统
选择 Flask 的场景:
- 中小型 Web 应用
- 微服务架构中的单个服务
- 快速原型验证
- 学习 Web 开发基础
- 需要高度定制化的项目
选择 FastAPI 的场景:
- 纯 API 服务
- 高并发 IO 密集型应用
- 实时数据处理
- 机器学习模型部署
- 前后端分离架构的后端
7.3 选型建议总结
需要 Admin 后台 + 快速开发大型应用 → Django
轻量灵活 + 自由度高 → Flask
高性能 API + 现代异步 + 自动文档 → FastAPI
8. 三者代码对比实战
下面用同一个「文章列表 API」需求,展示三者的实现差异。
8.1 Django 实现
python
# views.py
from django.http import JsonResponse
from .models import Article
def article_list(request):
articles = Article.objects.all().values("id", "title")
return JsonResponse(list(articles), safe=False)
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path("api/articles/", views.article_list),
]
8.2 Flask 实现
python
from flask import Flask, jsonify
from models import Article
app = Flask(__name__)
@app.route("/api/articles/")
def article_list():
articles = Article.query.all()
return jsonify([{"id": a.id, "title": a.title} for a in articles])
8.3 FastAPI 实现
python
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class ArticleOut(BaseModel):
id: int
title: str
@app.get("/api/articles/", response_model=list[ArticleOut])
async def article_list():
# 假设从数据库查询
return [{"id": 1, "title": "Hello FastAPI"}]
可以看到,三者都能实现同样的功能,但风格差异明显:Django 规范统一、Flask 简洁灵活、FastAPI 类型安全且自带文档。
9. 常见问题 FAQ
9.1 三个框架可以混用吗?
可以。 三者并不互斥,实际项目中完全可以在同一套系统里混用。最常见的组合是:用 Django 搭建管理后台和内容系统,用 FastAPI 提供高性能 API 服务,两者通过 HTTP 或消息队列通信。Flask 则适合作为轻量微服务嵌入整体架构。
python
# 示例:Django 后台 + FastAPI 服务通过 requests 通信
import requests
# 在 Django 视图中调用 FastAPI 服务
def proxy_view(request):
resp = requests.get("http://fastapi-service:8000/api/articles/")
return JsonResponse(resp.json(), safe=False)
需要注意的是,混用会增加架构复杂度和运维成本,建议仅在确实需要发挥各自优势时采用。
9.2 如何从 Flask 迁移到 FastAPI?
迁移的核心思路是:路由和依赖注入改造 + 数据校验改用 Pydantic + 异步化改造。步骤如下:
- 将
@app.route()改为@app.get()/@app.post(),并给函数参数加上类型声明。 - 用 Pydantic 模型替代手动解析
request.json。 - 将同步 IO 操作改为
async def,或保留同步函数让 FastAPI 在线程池中运行。 - 将
jsonify()返回值改为直接返回 Python 对象。
python
# Flask 写法
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/articles/", methods=["POST"])
def create_article():
data = request.json
return jsonify({"title": data["title"]})
python
# 迁移后的 FastAPI 写法
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class ArticleCreate(BaseModel):
title: str
content: str
@app.post("/articles/")
async def create_article(article: ArticleCreate):
return {"title": article.title}
官方迁移指南可参考:FastAPI 官方文档。
9.3 Django 和 FastAPI 如何选择?
| 判断维度 | 选 Django | 选 FastAPI |
|---|---|---|
| 是否需要 Admin 后台 | 是 | 否 |
| 是否以 API 为核心 | 否 | 是 |
| 是否需要高并发 | 一般 | 是 |
| 是否需要内置 ORM/认证 | 是 | 否 |
| 团队是否熟悉异步编程 | 否 | 是 |
一句话总结: 需要「全家桶」快速交付完整业务系统选 Django;需要高性能、类型安全的纯 API 服务选 FastAPI。两者也可以共存------Django 管后台,FastAPI 管对外 API。
9.4 学习顺序建议是什么?
推荐按「Flask → FastAPI → Django」的顺序学习:
- 先学 Flask:理解路由、请求响应、模板渲染等 Web 开发核心概念,上手成本最低。
- 再学 FastAPI:掌握类型提示、Pydantic 校验和异步编程,建立现代 API 开发思维。
- 最后学 Django:此时已具备基础,再学习 MTV、ORM、Admin 等「全家桶」能力会事半功倍。
python
# 学习路线速查
learning_path = ["Flask 基础", "FastAPI 进阶", "Django 全栈"]
如果你目标是快速上手做项目,也可以直接从 FastAPI 或 Django 入手,但建议至少用 Flask 跑通一个最小示例,理解底层原理后再深入。
9. 总结
参考资料
以下整理了三大框架的官方文档、GitHub 仓库以及推荐的社区教程与书籍,方便你进一步深入学习。
官方文档与 GitHub 仓库
-
Django
- 官方文档:https://docs.djangoproject.com/ ------ 最权威的 Django 学习入口,涵盖从入门到部署的完整指南。
- GitHub 仓库:https://github.com/django/django ------ 可查看源码、提交记录与 issue 讨论,深入理解框架内部实现。
-
Flask
- 官方文档:https://flask.palletsprojects.com/ ------ 清晰简洁的官方教程,适合快速上手与查阅 API。
- GitHub 仓库:https://github.com/pallets/flask ------ 由 Pallets 团队维护,可了解 Flask 的演进历史与设计哲学。
-
FastAPI
- 官方文档:https://fastapi.tiangolo.com/ ------ 被誉为「最好的框架文档之一」,交互式教程体验极佳。
- GitHub 仓库:https://github.com/fastapi/fastapi ------ 社区活跃,可查看源码、示例与丰富的讨论。
推荐社区教程与书籍
- 《Django 4 By Example》(第四版) ------ 通过多个实战项目循序渐进地掌握 Django 全栈开发,适合希望系统学习 Django 的读者。
- 《Flask Web Development》(第二版) ------ Miguel Grinberg 的经典之作,从零构建一个完整的 Flask 应用,覆盖认证、数据库、部署等核心主题。
- 《FastAPI 官方教程》 ------ 官方文档自带的交互式教程,从基础到进阶逐步深入,配合自动生成的 API 文档,学习体验极佳。
| 维度 | Django | Flask | FastAPI |
|---|---|---|---|
| 设计理念 | 大而全 | 小而精 | 快而新 |
| 学习曲线 | 陡峭 | 平缓 | 适中 |
| 性能 | 中 | 中 | 高 |
| 内置功能 | 极丰富 | 极少 | 适中 |
| 异步支持 | 部分 | 无 | 原生 |
| 自动 API 文档 | 无 | 无 | 有 |
| 适用场景 | 大型应用 | 中小型/微服务 | 高性能 API |
核心结论:
- 没有最好的框架,只有最合适的框架。 选型应基于项目需求、团队技术栈和业务场景。
- 三者并不互斥。 实际项目中,一个团队可能同时使用 Django 做管理后台、FastAPI 做高性能 API。
- 基础是相通的。 无论选择哪个框架,HTTP 协议、数据库设计、RESTful 规范等基础知识都是通用的。
- 建议初学者从 Flask 入门,理解 Web 开发核心概念后,再根据方向深入学习 Django 或 FastAPI。
希望本文的对比解析能帮助你做出明智的技术选型。如果你正在学习 Python Web 开发,建议动手用三个框架分别实现一个简单项目,亲身体验它们的差异,这比任何理论对比都更有说服力。