目录

Python Web 框架对比与选择

学习目标:深入理解 Django、Flask、FastAPI 三个主流框架的差异,掌握技术选型的方法论,能够根据项目需求做出合理决策。


1. 三个框架概览

Python Web 框架生态
│
├── Django (2005)          ← 全栈、成熟、 batteries included
│   └── "为你做好一切决定"
│
├── Flask (2010)           ← 微框架、灵活、自由组合
│   └── "你需要什么,就加什么"
│
└── FastAPI (2018)         ← 现代、异步、类型驱动
    └── "利用现代 Python 特性"

2. 多维度对比

2.1 核心定位

维度 Django Flask FastAPI
定位 全栈框架 微框架 现代 API 框架
设计哲学 约定优于配置 显式优于隐式 类型驱动开发
发布时间 2005 2010 2018
社区规模 极大 快速增长
学习曲线 较陡 平缓 中等

2.2 功能对比

功能 Django Flask FastAPI
ORM 内置(强大) 需扩展(SQLAlchemy) 需扩展
管理后台 内置(自动生成) 需扩展
表单处理 内置 需扩展(WTForms) Pydantic
认证系统 内置(完善) 需扩展(Flask-Login) 需扩展
模板引擎 内置(Django 模板) 内置(Jinja2) 需扩展
路由系统 URLconf 装饰器 装饰器 + 类型
数据验证 表单/序列化器 手动或扩展 Pydantic(自动)
API 文档 需扩展(DRF) 需扩展 自动生成
异步支持 Django 3.1+ 需扩展 原生支持
WebSocket Channels 需扩展 原生支持

2.3 性能对比

"""
基准测试(请求/秒,越高越好)

框架            异步    性能等级
─────────────────────────────────
FastAPI         是      ★★★★★  (约 18000+ req/s)
Starlette       是      ★★★★★  (约 18000+ req/s)
Flask           否      ★★☆☆☆  (约  2000+ req/s)
Django          可选    ★★☆☆☆  (约  1500+ req/s)

数据来源:TechEmpower Benchmarks(仅供参考)
"""

注意:实际性能受数据库、业务逻辑影响,框架差异通常不是瓶颈。

2.4 代码量对比

实现相同功能(返回 JSON 列表):

# ========== Django ==========
# views.py
from django.http import JsonResponse
from .models import User

def user_list(request):
    users = User.objects.values('id', 'name')
    return JsonResponse(list(users), safe=False)

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('users/', views.user_list),
]

# models.py
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    # settings.py, admin.py, apps.py ...

# ========== Flask ==========
from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))

@app.route('/users')
def user_list():
    users = User.query.all()
    return jsonify([{'id': u.id, 'name': u.name} for u in users])

# ========== FastAPI ==========
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List

app = FastAPI()

class User(BaseModel):
    id: int
    name: str

users_db = [
    User(id=1, name="张三"),
    User(id=2, name="李四")
]

@app.get("/users", response_model=List[User])
def user_list():
    return users_db
指标 Django Flask FastAPI
文件数 5+ 1 1
代码行数 30+ 20+ 15
配置复杂度
自动验证 需手动 需手动 自动
自动文档 需扩展 需扩展 内置

3. 适用场景分析

3.1 选择 Django 的场景

"""
Django 最佳场景:

├── 内容管理系统(CMS)
│   └── 新闻网站、博客、企业官网
├── 内部管理后台
│   └── 数据录入、审批流程、报表系统
├── 快速原型开发
│   └── 需要快速验证业务模型
├── 大型项目(团队开发)
│   └── 多人协作,需要统一规范
├── 需要丰富生态
│   └── Django REST Framework、Celery、Channels
└── 传统 Web 应用
    └── 多页面应用(MPA),SEO 友好
"""

典型项目:电商平台、社交网络、管理系统、新闻门户

3.2 选择 Flask 的场景

"""
Flask 最佳场景:

├── 微服务架构
│   └── 轻量级服务,独立部署
├── API 网关/代理
│   └── 路由转发、请求聚合
├── 小型项目/个人项目
│   └── 简单快速,无需重型框架
├── 学习和原型
│   └── 理解 Web 开发底层原理
├── 高度定制化需求
│   └── 需要自由选择组件
└── 机器学习模型部署
    └── 包装 ML 模型为 Web 服务
"""

典型项目:微服务、API 中间件、Webhook 服务、ML 服务

3.3 选择 FastAPI 的场景

"""
FastAPI 最佳场景:

├── 高性能 API 服务
│   └── 需要处理大量并发请求
├── 异步需求
│   └── 异步数据库、消息队列
├── 数据密集型应用
│   └── 复杂的输入验证、数据转换
├── 微服务 + API 优先
│   └── 前后端分离,移动端 API
├── 需要自动文档
│   └── 快速交付、API 版本管理
├── 现代 Python 项目
│   └── 类型提示、async/await
└── 实时应用
    └── WebSocket、SSE(Server-Sent Events)
"""

典型项目:SaaS API、实时数据服务、IoT 后端、金融交易系统


4. 技术选型决策树

项目类型?
│
├── 传统 Web 应用(多页面 + 后台管理)
│   └── 选择:Django
│
├── API 服务 / 微服务
│   │
│   ├── 需要高性能 / 异步?
│   │   ├── 是 → FastAPI
│   │   └── 否 → Flask 或 FastAPI
│   │
│   └── 需要自动文档 / 数据验证?
│       ├── 是 → FastAPI
│       └── 否 → Flask
│
├── 小型项目 / 学习
│   ├── 想快速出成果 → Flask
│   └── 想理解 Web 原理 → Flask 或 Django
│
└── 机器学习 / 数据服务
    ├── 需要异步 → FastAPI
    └── 简单包装 → Flask

5. 混合架构实践

在实际项目中,可以组合使用多个框架:

系统架构示例
│
├── 前端
│   └── React / Vue.js
│
├── API 网关(FastAPI)
│   ├── 统一认证
│   ├── 请求路由
│   └── 限流/熔断
│
├── 微服务
│   ├── 用户服务(FastAPI)
│   ├── 订单服务(Django + DRF)
│   └── 通知服务(Flask + Celery)
│
└── 管理后台(Django Admin)
    └── 运营人员使用

6. 其他框架简介

框架 定位 特点
Tornado 异步框架 长连接、WebSocket、高性能
Sanic 异步微框架 类 Flask API,异步原生
Pyramid 全栈/微框架 灵活,可伸缩
Bottle 微框架 单文件,零依赖
Falcon 高性能 API 极简,面向 API
Django Ninja Django 上的 FastAPI 结合 Django ORM + FastAPI 风格
Litestar 现代全栈 前身 Starlite,高性能

7. 部署与生态

7.1 部署方式对比

框架 推荐服务器 部署方式
Django Gunicorn / uWSGI WSGI
Flask Gunicorn / uWSGI WSGI
FastAPI Uvicorn / Hypercorn ASGI
# Django / Flask (WSGI)
gunicorn app:app -w 4 -b 0.0.0.0:8000

# FastAPI (ASGI)
uvicorn main:app --workers 4 --host 0.0.0.0 --port 8000

# 使用 Docker
docker run -d -p 8000:8000 myapp

7.2 周边生态

需求 Django Flask FastAPI
REST API Django REST Framework Flask-RESTful 内置
数据库迁移 内置(migrate) Flask-Migrate Alembic
任务队列 Celery + Django Celery Celery / RQ
缓存 内置 Flask-Caching 需扩展
测试 内置(TestCase) pytest pytest
部署 成熟文档 成熟文档 快速增长

8. 选型建议

8.1 新手推荐路径

阶段1(入门)
└── Flask → 理解 Web 开发基础概念

阶段2(进阶)
├── Django → 学习全栈开发和 ORM
└── FastAPI → 学习现代 API 开发

阶段3(实战)
└── 根据项目需求灵活选择

8.2 团队选型考虑因素

因素 Django Flask FastAPI
团队规模 大团队友好 小团队灵活 中等团队
招聘难度 容易 容易 较新,较少
长期维护 稳定(LTS) 社区活跃 快速发展
技术债务 可能较重 依赖管理 现代化

9. 小结

框架 一句话概括 最佳场景
Django “开箱即用的全栈方案” CMS、管理后台、快速开发
Flask “灵活自由的微框架” 微服务、API、小型项目
FastAPI “现代高性能的 API 框架” 异步 API、数据服务、实时应用

10. 练习题

  1. 为你正在做或计划做的项目,使用决策树分析应该选择哪个框架。
  2. 分别用 Django、Flask、FastAPI 实现同一个简单 API(如 TODO 列表),对比开发体验。
  3. 研究一个你熟悉的网站或应用,分析其技术栈可能的选择逻辑。
  4. 查看 Django REST Framework 和 FastAPI 的文档,对比它们处理相同功能的方式。

总结:没有最好的框架,只有最适合的框架。Django 适合快速交付全栈应用,Flask 适合灵活定制的场景,FastAPI 适合现代高性能 API。理解项目需求是做出正确选择的关键。


第八阶段(Web 开发)完。接下来将进入第九阶段:实用工具。