Python Web 生態的分水嶺
2018 年是 Python web 的分水嶺。FastAPI 出現之前,Django 和 Flask 是唯二的主流選擇。之後格局變了:
| Framework | 定位 | 底層協議 | 型別安全 | Proto 素材 |
|---|---|---|---|---|
| Django | batteries-included,CRUD 王者 | WSGI(sync) | Django REST Framework(繁瑣) | — 未用過 |
| FastAPI | async-first,API 開發首選 | ASGI(async) | Pydantic 原生,OpenAPI 自動生成 | ✅ proto2661047/b2e/fastapi(完整實作) |
| Flask | minimal,但 2026 年理由越來越少 | WSGI(sync) | 無原生,接第三方 | — 未用過 |
| Starlette | FastAPI 的底層 toolkit | ASGI(async) | 無 Pydantic,需自接 | — 未用過 |
閱讀建議:新 Python API 專案直接選 FastAPI(proto 完整、async-first、型別安全)。Django 的核心優勢是 Admin panel 和完整生態,不是 API 效能。Flask 和 Starlette 直接用 FastAPI 就好,不需要另外學。
理解這四個的定位,你就知道新專案該選哪個。
Django:Batteries-Included 的王者
Django(2005)的設計哲學是「一個框架給你全部」:ORM、Admin panel、authentication、form handling、template engine。你不需要選哪個 ORM、哪個 auth library——Django 都幫你決定了。
# Django model — ORM 直接 built-in
class User(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'users'
# Django REST Framework view
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.select_related('profile').all()
serializer_class = UserSerializer
permission_classes = [IsAuthenticated]
filter_backends = [DjangoFilterBackend, SearchFilter]
search_fields = ['name', 'email']
# 一行設定 → 完整 CRUD + filtering + pagination
router.register(r'users', UserViewSet)Django Admin 是 Django 最強的殺手鐧——幾行設定就有一個功能完整的後台管理介面,對 MVP 和內部工具極其有用。
Django 的 async 痛點:
Django 的 ORM 是從同步設計出發的,async 是 3.1 版(2020)才加入,但很多操作還是要用 sync_to_async() 包裝:
# Django async view + ORM 的痛苦
async def user_detail(request, id):
# User.objects.get() 是同步的,需要包裝
user = await sync_to_async(User.objects.get)(pk=id)
# 或 Django 4.1 的 async ORM
user = await User.objects.aget(pk=id) # async get
return JsonResponse({'name': user.name})比較 FastAPI 同樣的操作:
# FastAPI + SQLAlchemy async
async def user_detail(id: int, db: AsyncSession = Depends(get_db)):
result = await db.execute(select(User).where(User.id == id))
user = result.scalar_one_or_none()
return userDjango 適合:標準 CRUD 為主、需要 Admin panel、不需要高並發的系統;MVP 快速開發。
FastAPI:2026 年 Python API 開發的最佳選擇
FastAPI(2018)解決的是 Flask / Django 的幾個具體問題:
問題一:request body 沒有型別安全
Flask / Django:body 是 dict,你自己解析,自己驗證,TypeScript 的 any 問題 Python 版。
FastAPI:宣告 Pydantic schema 就完成了。
from pydantic import BaseModel, EmailStr, Field
class UserCreate(BaseModel):
name: str = Field(min_length=1, max_length=100)
email: EmailStr
age: int = Field(ge=0, le=150)
@app.post("/users", status_code=201)
async def create_user(user: UserCreate):
# user.name, user.email, user.age 全部已驗證且有型別
return await user_service.create(user)問題二:API 文件要手寫
Flask / Django REST Framework:Swagger 要靠插件,還要手寫 docstring 或 schema。
FastAPI:OpenAPI 文件自動生成,/docs 直接可用,不需要任何設定:
@app.post("/users",
status_code=201,
summary="Create a new user",
response_model=UserResponse,
responses={400: {"model": ErrorResponse}},
)
async def create_user(user: UserCreate):
...
# /docs 自動有這個 endpoint 的完整文件,包含 schema、example、response codes問題三:async 是事後加的
Flask / Django 的 async 支援都有歷史包袱。FastAPI 從第一天就是 async-first。
FastAPI 的缺點:
- 沒有內建 admin panel(需要 Piccolo Admin、SQLAdmin 等第三方)
- 沒有內建 ORM(需要自己選 SQLAlchemy、Tortoise ORM 等)
- 比 Django 要自己搭的東西更多——資料夾結構、ORM 選型、DB session 管理都要自己決定
FastAPI 的完整技術棧(proto 的選型):
FastAPI(routing + DI)
+ Pydantic(validation + serialization)
+ SQLAlchemy async(ORM)
+ Alembic(migration)
+ Uvicorn(ASGI server)
+ Python-jose / python-multipart(auth / form)
這個組合覆蓋了 Django 除了 Admin panel 以外的所有功能,而且型別安全遠優於 Django。
FastAPI 適合:I/O 密集的高 QPS API;需要 OpenAPI 文件;重視型別安全;新 Python 後端專案的首選。
Flask:輕量,但 2026 年的理由越來越少
Flask(2010)和 Express 一樣:minimal,只給你路由和 middleware,其他都自己來。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json() # ← dict,沒有驗證,沒有型別
name = data.get('name')
email = data.get('email')
# 自己驗證、自己格式化...
return jsonify({'id': 1, 'name': name}), 201Flask 的問題是:它的 async 支援比 FastAPI 差很多,生態也在 FastAPI 出現後大量遷移。2026 年如果你需要 minimal Python web framework,FastAPI 幾乎在所有維度都優於 Flask。
Flask 還在的場景:維護既有 Flask 應用;極輕量的一次性腳本 API(不值得設 FastAPI 的 Pydantic 架構)。
Starlette:FastAPI 的底層
Starlette 是 FastAPI 的底層 ASGI framework,比 FastAPI 更低層次——不包含 Pydantic 整合,但提供路由、middleware、WebSocket、background tasks 的基礎設施。
# 直接用 Starlette(很少這樣做)
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
async def user_list(request):
users = await user_service.find_all()
return JSONResponse([u.dict() for u in users])
app = Starlette(routes=[
Route('/users', user_list),
])直接用 Starlette 的場景:你需要比 FastAPI 更低層次的控制,或你在做 ASGI middleware / plugin 開發。一般 API 開發直接用 FastAPI。
選擇決策
需要 Admin panel 和完整 batteries-included?
→ Django + DRF
API-first、型別安全、async-first、OpenAPI 自動文件?
→ FastAPI
維護既有 Flask 專案?
→ Flask(不要新起一個 Flask 專案了)
低層次 ASGI middleware / plugin 開發?
→ Starlette
