Python Web 框架对比与实战:Django vs Flask vs FastAPI
很多框架对比文章喜欢用一句话概括:Django 大而全,Flask 轻量,FastAPI 性能高。
这句话没错,但对真正的技术选型帮助有限。
项目做到半年以后,你真正会在意的是另外几件事:ORM 和数据库迁移谁维护、接口参数谁校验、后台管理系统要不要自己写、异步链路是否真的跑得起来,以及团队新增十几个模块以后,代码还能不能保持同一种组织方式。
Django、Flask 和 FastAPI 的区别,恰恰就在这些地方。
先给结论:三者解决的不是完全相同的问题
截至 2026 年 8 月,Django 最新稳定版为 6.1,Flask 为 3.1.3,FastAPI 为 0.141.1。Django 6.1 要求 Python 3.12+,Flask 3.1.3 要求 Python 3.9+,FastAPI 0.141.1 要求 Python 3.10+。另外,Django 5.2 仍然是 LTS 版本,因此长期维护的企业项目并不一定要机械地追最新 6.1。
先看最核心的差异:
| 对比项 | Django | Flask | FastAPI |
|---|---|---|---|
| 定位 | 全功能 Web 框架 | 微框架 | API 优先框架 |
| 最新版本基线 | 6.1 | 3.1.3 | 0.141.1 |
| Web 协议模型 | WSGI + ASGI | WSGI | ASGI |
| ORM | 内置 Django ORM | 不内置 | 不内置 |
| 数据库迁移 | 内置 | 通常 Alembic | 通常 Alembic |
| 参数校验 | Forms / 自行处理 / 第三方 | 自行处理 / 第三方 | Pydantic 原生集成 |
| OpenAPI | 非核心能力 | 非核心能力 | 自动生成 |
| Swagger UI | 需第三方 | 需第三方 | 内置 |
| Admin | 内置且成熟 | 无 | 无 |
| 用户认证体系 | 内置 | 扩展实现 | 提供安全组件,但业务体系自己搭 |
| 异步支持 | 已支持 ASGI 与大量异步 API | 支持 async view,但仍以 WSGI 为核心 | 原生 ASGI、async-first |
| 项目约束 | 强 | 弱 | 中等 |
| 上手成本 | 中等 | 低 | 低 |
| 大型项目一致性 | 很强 | 依赖团队规范 | 较强 |
| 典型场景 | CMS、ERP、内容平台、复杂业务后台 | 小型服务、Webhook、内部工具 | REST API、微服务、AI 服务、高并发 I/O |
真正值得记住的是:
Django 给你的是一套完整后端体系,Flask 给你的是组装后端的自由,FastAPI 给你的是围绕 API 契约构建服务的能力。
Django:框架已经替你做了大量架构决定
安装 Django:
pip install Django==6.1
django-admin startproject config .
python manage.py startapp users
python manage.py runserver
一个 Django 项目创建完成后,很多后端项目迟早需要的东西实际上已经存在:
config/
├── settings.py
├── urls.py
├── asgi.py
└── wsgi.py
users/
├── admin.py
├── apps.py
├── migrations/
├── models.py
├── tests.py
└── views.py
数据库 ORM、Migration、Session、Cookie、Authentication、Middleware、Template、Form、Admin、CSRF 防护都在一个统一体系中。
这也是 Django 最大的价值。
有人觉得这些东西“太重”,但如果你的项目本来就要做用户、权限、数据库、运营后台、内容管理,那么它们并不是负担。
你自己重新装一遍才是负担。
例如定义一个用户资料模型:
# users/models.py
from django.db import models
class UserProfile(models.Model):
name = models.CharField(max_length=50)
age = models.PositiveSmallIntegerField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
执行:
python manage.py makemigrations
python manage.py migrate
数据库表结构就进入 Django 的 Migration 管理体系。
后台甚至只需要:
# users/admin.py
from django.contrib import admin
from .models import UserProfile
admin.site.register(UserProfile)
就已经拥有一个可以增删改查数据的后台界面。
对于内容平台、电商后台、CRM、ERP 一类项目,这个能力的价值远远超过几个百分点的接口吞吐差异。
Django 的代价也很明确
Django 有自己的项目组织方式。
Model 怎么写、URL 怎么注册、Middleware 怎么配置、Migration 怎么运行,都有比较明确的规则。
如果团队喜欢完全自由地组织代码,刚开始会觉得 Django 有些“管得太多”。
但大型项目里,这种限制往往反而是优势。
Flask 项目里最容易出现的一个问题就是:
项目 A:
controller/
service/
repository/
项目 B:
routes/
handlers/
dao/
项目 C:
api/
business/
database/
每个人都能写出自己喜欢的结构。
Django 则很难偏到这么远。
Flask:轻量不意味着功能少,而意味着决定权在你手里
Flask 的 Hello World 可能是三个框架中最直接的:
pip install Flask==3.1.3
from flask import Flask
app = Flask(__name__)
@app.get("/")
def index():
return {"message": "Hello Flask"}
运行:
flask --app app run
它没有要求你先建立完整项目,也不会规定:
ORM 必须是什么
Migration 必须是什么
目录应该怎么分
参数验证应该用什么
登录系统应该怎么做
这就是 Flask 的设计魅力。
但很多刚接触 Flask 的开发者会把“代码少”误解成“项目简单”。
实际上,当项目继续增长,你很快就会开始选择:
Flask
│
├── SQLAlchemy
├── Alembic
├── Pydantic / Marshmallow
├── Flask-Login
├── Flask-JWT-Extended
├── Flask-Caching
└── ...
Flask 没有把复杂度消灭。
它只是把选择权交给了你。
这在小服务里非常舒服,在大型团队里则意味着必须自己建立工程规范。
Blueprint 是 Flask 项目必须尽早使用的东西
不要让生产项目最后变成一个几千行的 app.py。
Flask 官方提供 Blueprint 来拆分大型应用。
例如:
app/
├── __init__.py
├── extensions.py
├── user/
│ ├── routes.py
│ └── service.py
└── order/
├── routes.py
└── service.py
# app/user/routes.py
from flask import Blueprint
user_bp = Blueprint("user", __name__, url_prefix="/users")
@user_bp.get("/<int:user_id>")
def get_user(user_id):
return {
"id": user_id,
"name": "Tom"
}
然后:
app.register_blueprint(user_bp)
如果一个 Flask 项目已经开始出现十几个业务模块,却还没有 Application Factory、Blueprint 和统一的扩展初始化方式,后面通常会越来越难维护。
FastAPI:类型声明本身就是 API 契约
FastAPI 最有价值的地方其实不是“Fast”。
而是它把 Python 类型系统、数据验证、OpenAPI 和接口文档连成了一条链。
安装:
pip install "fastapi[standard]==0.141.1"
创建:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def index():
return {"message": "Hello FastAPI"}
运行:
fastapi dev
FastAPI 会直接提供:
/docs
/redoc
/openapi.json
它基于 OpenAPI 描述接口,同时结合 Pydantic 完成请求数据转换和验证,Swagger UI 和 ReDoc 也可以直接使用。
例如:
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class UserCreate(BaseModel):
name: str = Field(min_length=1, max_length=50)
age: int = Field(ge=0, le=150)
@app.post("/users")
async def create_user(user: UserCreate):
return {
"name": user.name,
"age": user.age
}
请求:
{
"name": "Tom",
"age": 25
}
如果传:
{
"name": "",
"age": -1
}
不需要自己写:
if age < 0:
...
Pydantic 会执行验证,FastAPI 再把验证规则加入 OpenAPI Schema。
这意味着一份类型声明同时服务于:
Python 类型检查
↓
请求参数解析
↓
参数验证
↓
JSON Schema
↓
OpenAPI
↓
Swagger 文档
这才是 FastAPI 开发 API 时真正舒服的地方。
同一个 API,用三个框架分别实现
假设现在要做两个接口:
POST /users
GET /users/{id}
用户字段:
id
name
age
为了让框架差异更明显,这里暂时不用数据库,而使用内存字典。
重点不是比谁少写两行代码,而是看“框架默认替你做了什么”。
Django 实现
# users/views.py
import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
users = {}
next_id = 1
@csrf_exempt
def create_user(request):
global next_id
if request.method != "POST":
return JsonResponse(
{"message": "Method not allowed"},
status=405
)
try:
data = json.loads(request.body)
except json.JSONDecodeError:
return JsonResponse(
{"message": "Invalid JSON"},
status=400
)
name = data.get("name")
age = data.get("age")
if not isinstance(name, str) or not name:
return JsonResponse(
{"message": "Invalid name"},
status=400
)
if not isinstance(age, int) or age < 0:
return JsonResponse(
{"message": "Invalid age"},
status=400
)
user = {
"id": next_id,
"name": name,
"age": age
}
users[next_id] = user
next_id += 1
return JsonResponse(user, status=201)
def get_user(request, user_id):
user = users.get(user_id)
if user is None:
return JsonResponse(
{"message": "User not found"},
status=404
)
return JsonResponse(user)
URL:
# users/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("users", views.create_user),
path("users/<int:user_id>", views.get_user),
]
这里使用 csrf_exempt 只是为了让独立 JSON Demo 可以直接调用。
生产环境如果使用 Cookie / Session 登录,不能看到 CSRF 报错就顺手把所有 API 的 CSRF 防护关掉。
更关键的问题是:纯 Django 并没有把 REST API 请求模型、序列化、统一验证当作核心开发模型。
因此真正的大型 Django API 项目,通常会继续引入 Django REST Framework、Django Ninja 等 API 层。
这不是 Django 做不到。
而是它的核心抽象从一开始就不是“API Schema”。
Flask 实现
from flask import Flask, jsonify, request
app = Flask(__name__)
users = {}
next_id = 1
@app.post("/users")
def create_user():
global next_id
data = request.get_json(silent=True)
if data is None:
return jsonify({
"message": "Invalid JSON"
}), 400
name = data.get("name")
age = data.get("age")
if not isinstance(name, str) or not name:
return jsonify({
"message": "Invalid name"
}), 400
if not isinstance(age, int) or age < 0:
return jsonify({
"message": "Invalid age"
}), 400
user = {
"id": next_id,
"name": name,
"age": age
}
users[next_id] = user
next_id += 1
return jsonify(user), 201
@app.get("/users/<int:user_id>")
def get_user(user_id):
user = users.get(user_id)
if user is None:
return jsonify({
"message": "User not found"
}), 404
return jsonify(user)
相比 Django,Flask 少了项目级结构,但参数验证仍然需要自己解决。
当然,可以继续安装 Pydantic:
pip install pydantic
也可以安装 Marshmallow。
问题就在这里。
Flask 的答案经常是:
“你想怎么做都可以。”
这句话既是它最大的优点,也是大型项目最大的风险。
FastAPI 实现
from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel, Field
app = FastAPI()
users = {}
next_id = 1
class UserCreate(BaseModel):
name: str = Field(min_length=1, max_length=50)
age: int = Field(ge=0, le=150)
class UserResponse(UserCreate):
id: int
@app.post(
"/users",
response_model=UserResponse,
status_code=status.HTTP_201_CREATED
)
async def create_user(user: UserCreate):
global next_id
result = UserResponse(
id=next_id,
name=user.name,
age=user.age
)
users[next_id] = result
next_id += 1
return result
@app.get(
"/users/{user_id}",
response_model=UserResponse
)
async def get_user(user_id: int):
user = users.get(user_id)
if user is None:
raise HTTPException(
status_code=404,
detail="User not found"
)
return user
这里已经同时定义了:
请求模型
响应模型
字段限制
HTTP 状态码
路径参数类型
错误状态
OpenAPI Schema
Swagger 文档
这就是为什么纯 API 项目用 FastAPI 往往会感觉明显顺手。
不是因为装饰器比 Flask 高级。
而是框架把 API 开发中最常重复的那部分工作直接变成了一等公民。
真正拉开差距的是 async,而不是 async def 三个字
现在三个框架都能看到 async def,所以很容易产生一个错误判断:
都支持 async,那异步能力应该差不多。
实际上差别很大。
Flask 的 async 并没有改变它的 WSGI 核心
Flask 3.1 可以写:
@app.get("/data")
async def get_data():
result = await query_remote_api()
return result
但 Flask 官方文档明确说明:作为 WSGI 应用,一个 worker 在处理 async view 时仍然负责一个 request/response cycle。
也就是说,async 可以帮助一个请求内部并发等待多个 I/O,但并不会把 Flask 自动变成 ASGI 异步服务器。
例如:
async def get_data():
a, b = await asyncio.gather(
request_service_a(),
request_service_b()
)
这种场景有价值。
但如果你的目标是 WebSocket、大量长连接或者整个服务链路都是异步 I/O,Flask 就不是最自然的选择。
FastAPI 从底层就是 ASGI 模型
FastAPI 基于 Starlette,通常配合 Uvicorn 等 ASGI Server。
如果数据库驱动、Redis、HTTP Client 都支持异步:
@app.get("/dashboard")
async def dashboard():
user = await query_user()
orders = await query_orders()
return {
"user": user,
"orders": orders
}
请求等待数据库的时候,Event Loop 可以继续处理其他连接。
FastAPI 还允许:
def
和:
async def
同时存在。
普通 def 路由会进入线程池执行,而异步路由直接运行在异步调用链中。
这里有一个非常常见的坑:
@app.get("/users")
async def users():
result = requests.get("https://example.com")
return result.json()
代码虽然写了:
async def
但 requests.get() 是阻塞调用。
Event Loop 还是会被卡住。
应该使用真正的异步客户端,例如:
import httpx
@app.get("/users")
async def users():
async with httpx.AsyncClient() as client:
response = await client.get(
"https://example.com"
)
return response.json()
异步性能来自整条调用链,而不是函数前面的 async。
这个问题比选 Django、Flask 还是 FastAPI 本身更容易导致线上性能异常。
Django 的异步能力已经比很多旧文章描述得完整
现在再说“Django 只能同步”已经不准确。
Django 6.1 支持 ASGI,View 可以写成:
async def user_view(request):
...
ORM 也已经提供大量异步接口,例如:
user = await User.objects.aget(id=1)
await User.objects.acreate(
name="Tom"
)
以及:
async for user in User.objects.filter(active=True):
...
缓存、认证、Session、Signals 等多个组件也已经拥有异步 API。
不过 Django 当前的异步体系仍然有边界。
例如异步模式下数据库事务还不能完全按照同步 ORM 的方式直接使用,官方建议把需要事务的代码封装成同步函数,再通过 sync_to_async() 调用。异步模式下还需要特别关注同步 Middleware,因为同步和异步栈之间发生适配会增加额外成本。
所以现在更准确的描述应该是:
Flask
支持在 WSGI 模型中使用 async
Django
同时支持传统同步体系和逐渐完整的 ASGI 异步体系
FastAPI
从设计开始就是 API + ASGI + async-first
不要把 FastAPI 的高性能理解成“换框架就能让系统变快”
如果只测试:
@app.get("/")
async def hello():
return {"hello": "world"}
FastAPI 通常会表现得非常漂亮。
官方也引用了 TechEmpower 等基准结果说明 FastAPI/Uvicorn 在 Python Web 框架中具有很强的性能表现。
但生产接口往往长这样:
HTTP Request
↓
JWT
↓
Redis
↓
MySQL
↓
业务计算
↓
RPC
↓
JSON Serialize
假设:
框架处理耗时:0.5 ms
SQL 查询耗时:30 ms
RPC 调用耗时:50 ms
你把框架优化快一倍,可能只省了:
0.25 ms
把 SQL 从 30 ms 优化到 5 ms,却直接省了:
25 ms
所以对于普通 CRUD 系统:
ORM 查询方式、索引、连接池、缓存、N+1 查询和远程调用,往往比框架 Benchmark 更值得关注。
FastAPI 真正明显的性能优势,更多体现在高 I/O 并发以及大量连接同时等待数据库、Redis、RPC、LLM API 等场景。
CPU 密集型任务,三个框架都救不了你
例如:
@app.post("/generate")
async def generate():
result = run_heavy_cpu_task()
return result
假设 run_heavy_cpu_task() 是:
视频编码
大型 Excel 运算
机器学习推理
图片处理
复杂数据计算
即使换成 FastAPI,也不会因为用了 async 就突然得到 CPU 并行能力。
CPU 密集任务通常要考虑:
多进程
Celery
RQ
独立 Worker
GPU Worker
任务队列
独立推理服务
不要拿异步并发解决 CPU 并行问题。
这是另外一套问题。
ORM:Django 的优势非常明显
如果项目数据库逻辑很重,Django ORM 是 Django 很重要的竞争力。
比如:
users = (
User.objects
.filter(active=True)
.select_related("profile")
.prefetch_related("roles")
.order_by("-created_at")
)
Migration 同样已经集成:
python manage.py makemigrations
python manage.py migrate
开发者不需要额外决定 ORM 和 Migration 体系。
Flask 和 FastAPI 则通常需要自行组合:
SQLAlchemy
+
Alembic
例如:
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
然后配置:
engine
session
repository
migration
connection pool
FastAPI 官方没有强制绑定某个 ORM。
这其实是合理的,因为它定位就是 API 框架,而不是 Django 那种完整业务平台。
但也意味着:
FastAPI 项目代码短,不代表完整后端系统代码一定少。
等你把数据库、Migration、Redis、权限、日志、配置、后台任务和 Admin 都装进去,两者的工程规模差异就没有 Hello World 看起来那么夸张。
Admin 是一个经常被低估的 Django 优势
假设现在产品说:
给运营做个后台,可以查询用户、修改状态、封禁账号、看订单。
Django 很可能是:
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = [
"id",
"username",
"status",
"created_at"
]
search_fields = [
"username"
]
list_filter = [
"status"
]
很多内部运营需求就已经能用了。
Flask 和 FastAPI 如果没有预先接入 Admin 组件,通常意味着:
后台前端
+
后台 API
+
权限
+
搜索
+
分页
+
表单
+
数据校验
这可能直接变成一个独立项目。
所以如果一个系统天然需要大量:
运营后台
内容管理
用户管理
权限管理
数据录入
配置管理
Django 的竞争力会非常强。
只看 API QPS 会完全看错重点。
三种框架的大型项目结构应该怎么设计
Django
比较自然的方式是按业务 Domain 拆 App:
project/
├── config/
│ ├── settings.py
│ ├── urls.py
│ └── asgi.py
│
├── users/
│ ├── models.py
│ ├── services.py
│ ├── urls.py
│ └── views.py
│
├── orders/
│ ├── models.py
│ ├── services.py
│ ├── urls.py
│ └── views.py
│
└── payments/
├── models.py
├── services.py
└── views.py
不要把所有业务都塞进:
views.py
Django 项目大了以后,真正应该控制的是 Model 和 View 不要无限膨胀。
复杂业务逻辑应该逐渐进入:
service
domain service
selector/query service
等独立层。
Flask
Flask 更依赖团队主动建立边界:
app/
├── __init__.py
├── extensions.py
├── config.py
│
├── users/
│ ├── routes.py
│ ├── service.py
│ ├── model.py
│ └── schema.py
│
├── orders/
│ ├── routes.py
│ ├── service.py
│ ├── model.py
│ └── schema.py
│
└── common/
一个成熟 Flask 项目不能真的按照 Hello World 的方式一直扩展。
FastAPI
FastAPI 很容易按 Router + Schema + Service 组织:
app/
├── main.py
├── core/
│ ├── config.py
│ └── security.py
│
├── db/
│ ├── session.py
│ └── models.py
│
├── users/
│ ├── router.py
│ ├── schema.py
│ ├── service.py
│ └── repository.py
│
└── orders/
├── router.py
├── schema.py
├── service.py
└── repository.py
路由:
router = APIRouter(
prefix="/users",
tags=["users"]
)
最后:
app.include_router(user_router)
app.include_router(order_router)
这种结构对微服务和 API 项目比较自然。
FastAPI 的依赖注入比很多人想象得更重要
例如数据库 Session:
from fastapi import Depends
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.get("/users/{user_id}")
def get_user(
user_id: int,
db=Depends(get_db)
):
...
认证也可以变成依赖:
def get_current_user():
...
@app.get("/profile")
def profile(
user=Depends(get_current_user)
):
return user
继续组合:
Route
↓
Permission
↓
Current User
↓
Token
↓
Database Session
FastAPI 会解析整个依赖关系。
相比到处手动写:
check_token()
check_permission()
get_db()
这种方式更适合 API 层的横切逻辑。
FastAPI 官方也把 Dependency Injection 作为核心能力之一,而不是附加插件。
到底什么时候选 Django?
如果项目符合下面几项:
关系型数据库业务很多
需要 Admin
需要用户权限
需要 Session
需要后台页面
模块非常多
生命周期很长
团队成员较多
Django 通常是最省工程成本的选择。
典型系统包括:
CMS
小说/内容平台
ERP
CRM
电商后台
教育平台
运营系统
传统 SaaS
这种项目真正昂贵的是业务复杂度,而不是 HTTP 框架的几百微秒。
如果是长期稳定运行的企业项目,Django 5.2 LTS 甚至可能比刚发布的 6.1 更适合作为版本基线;如果希望使用 6.1 的新能力并且第三方包兼容性已经确认,再选择 6.1。
什么时候选 Flask?
Flask 更适合需求边界清楚的小型服务。
例如:
Webhook 接收器
内部 API
小型后台
数据查询接口
简单微服务
已有 WSGI 系统扩展
脚本 Web 化
尤其当服务主要是同步代码,而且团队已经有成熟的:
SQLAlchemy
Alembic
认证
配置
日志
项目模板
Flask 依然非常好用。
但不要因为项目现在只有五个接口,就自动认为 Flask 最合适。
小项目变成大项目以后,Flask 不会突然替你补上工程规范。
这个成本要提前算。
什么时候选 FastAPI?
如果项目天然就是:
API First
FastAPI 往往是三个框架里最自然的。
尤其适合:
REST API
微服务
API Gateway
AI / LLM 服务
模型推理 API
高并发 I/O 服务
内部服务接口
前后端分离项目
例如一个 AI 接口需要同时访问:
Redis
用户服务
模型服务
向量数据库
第三方 LLM API
这些操作大部分都在等待网络 I/O。
这种情况下:
asyncio.gather(...)
配合真正异步的客户端和数据库驱动,可以很好地发挥 ASGI 并发模型。
而类型系统 + Pydantic + OpenAPI 也特别适合前后端或者多个微服务之间约定 API Contract。
一个简单的选型决策树
可以直接按下面的逻辑判断:
项目是否需要大量后台管理、ORM、权限和传统 Web 能力?
│
┌─────┴─────┐
│ │
是 否
│ │
Django 是否 API First?
│
┌─────┴─────┐
│ │
是 否
│ │
FastAPI 服务是否很小,
并且主要是同步逻辑?
│
┌─────┴─────┐
│ │
是 否
│ │
Flask 再看具体架构
如果现在让我重新做一个 Python 后端
如果是一个纯 REST API,我会优先考虑:
FastAPI
+
Pydantic
+
SQLAlchemy
+
Alembic
+
PostgreSQL / MySQL
+
Redis
如果是一个有大量运营后台、用户体系和复杂关系数据的平台,我会优先考虑:
Django
+
Django ORM
+
Django Admin
+
PostgreSQL / MySQL
+
Redis
如果只是一个十几个接口的小服务、Webhook 或已有同步 Python 系统的补充模块:
Flask
通常已经足够。
这里没有“FastAPI 一定比 Django 新,所以一定更好”这种结论。
FastAPI 把 API 开发做得非常舒服,但它不会自动给你一个 Django Admin,也不会替你建立完整业务系统。
Django 看起来重,但当一个项目本来就需要它提供的大部分功能时,所谓的“重”其实是已经替你写好的基础设施。
Flask 则处在中间一个很特殊的位置:框架本身极其克制,你可以把它构造成任何样子,但项目最终是否优雅,更多取决于团队,而不是 Flask。
选框架时真正应该问的不是:
谁的 Benchmark QPS 最高?
而应该问:
我们这个系统两年以后,最大的复杂度会在哪里?
如果答案是业务、权限、后台和数据模型,偏向 Django。
如果答案是 API Contract 和异步 I/O,偏向 FastAPI。
如果系统本来就很小,而且你明确知道自己需要哪些组件,Flask 仍然是非常干净的选择。
这比单纯比较三段 Hello World 有意义得多。
参考资料
- Django 6.1 于 2026 年 8 月发布,当前 PyPI 稳定版本信息及 Python 要求。
- Django 5.2 为 LTS 版本。
- Django 6.1 异步请求栈、异步 ORM 及当前事务限制。
- Flask 3.1.3 版本及 Python 要求。
- Flask 官方关于 async view、WSGI worker 与后台任务的说明。
- FastAPI 0.141.1 当前版本信息以及 Starlette、Pydantic、OpenAPI、Swagger UI 等核心能力。
- FastAPI 官方 async / await 工作机制说明。