作者:IT策士
10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在公众号、今日头条持续发布最新文章,助你少走弯路。
当你准备开始一个 Web 项目时,面对 Django、Flask、FastAPI 这三个主流 Python 框架,很容易陷入选择困难。本文将通过实际代码、控制台输出、架构对比,帮你理清思路。
一、一句话总结核心差异
| 框架 | 定位 | 一句话 |
|---|---|---|
| Django | 全栈大而全 | 自带一切,开箱即用,适合大型项目 |
| Flask | 微型灵活 | 极简内核,需自己组装组件,适合小型项目 |
| FastAPI | 高性能现代 | 异步、自动文档、类型提示,适合 API 服务 |
二、一个最简单的例子:三框架实现“用户注册”
场景:实现用户注册接口,存入数据库,返回 JSON。
1. Django 实现
# models.py
from django.db import models
class User(models.Model):
username = models.CharField(max_length=80, unique=True)
email = models.EmailField()
password = models.CharField(max_length=128) # 真实项目中请加密
# views.py
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
@csrf_exempt
def register(request):
if request.method == 'POST':
data = json.loads(request.body)
user = User.objects.create(
username=data['username'],
email=data['email'],
password=data['password']
)
return JsonResponse({'id': user.id, 'username': user.username}, status=201)
运行效果:
$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
September 15, 2024 - 12:00:00
Django version 5.0, using settings 'myproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
请求与响应:
$ curl -X POST http://localhost:8000/register/ \
-H "Content-Type: application/json" \
-d '{"username":"alice","email":"alice@example.com","password":"123"}'
# 响应:
{"id": 1, "username": "alice"}
2. Flask 实现
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120))
password = db.Column(db.String(128))
@app.route('/register', methods=['POST'])
def register():
data = request.get_json()
user = User(username=data['username'], email=data['email'], password=data['password'])
db.session.add(user)
db.session.commit()
return jsonify({'id': user.id, 'username': user.username}), 201
if __name__ == '__main__':
app.run(debug=True)
运行效果:
$ python app.py
* Serving Flask app 'app'
* Debug mode: on
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
3. FastAPI 实现
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from sqlalchemy import create_engine, Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
app = FastAPI()
engine = create_engine('sqlite:///users.db')
SessionLocal = sessionmaker(bind=engine)
Base = declarative_base()
class UserDB(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(80), unique=True)
email = Column(String(120))
password = Column(String(128))
Base.metadata.create_all(bind=engine)
class UserCreate(BaseModel):
username: str
email: str
password: str
@app.post('/register', response_model=dict)
async def register(user: UserCreate):
db = SessionLocal()
new_user = UserDB(username=user.username, email=user.email, password=user.password)
db.add(new_user)
db.commit()
db.refresh(new_user)
db.close()
return {'id': new_user.id, 'username': new_user.username}
运行效果:
$ uvicorn app:app --reload
INFO: Started server process [12345]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000
自带交互文档: 访问 http://localhost:8000/docs
三、架构对比图
┌─────────────────────────────────────────────────────────────────┐
│ Django 架构 │
├─────────────────────────────────────────────────────────────────┤
│ ┌────────┐ ┌──────────┐ ┌───────┐ ┌─────────┐ ┌─────────┐ │
│ │ Models │◄─┤ Admin │ │ Forms │ │ Auth │ │ Sessions│ │
│ └───┬────┘ └──────────┘ └───┬───┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ └──────────────┬───────────┴───────────┴────────────┘ │
│ ▼ │
│ ┌─────────────┐ │
│ │ ORM │ │
│ └──────┬──────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Views (FBV/CBV) │ │
│ └──────────────────────────┬──────────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ URL Conf (urls.py) │ │
│ └──────────────────────────┬──────────────────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Templates (jinja2风格) │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────┐ ┌─────────────────────────┐
│ Flask 架构 │ │ FastAPI 架构 │
├─────────────────────┤ ├─────────────────────────┤
│ │ │ │
│ ┌────────────┐ │ │ ┌──────────────┐ │
│ │ Werkzeug │ │ │ │ Starlette │ │
│ │ (WSGI) │ │ │ │ (ASGI) │ │
│ └─────┬──────┘ │ │ └──────┬───────┘ │
│ ▼ │ │ ▼ │
│ ┌────────────┐ │ │ ┌──────────────┐ │
│ │ Routes │ │ │ │ Pydantic │ │
│ └─────┬──────┘ │ │ │ (数据验证) │ │
│ ▼ │ │ └──────┬───────┘ │
│ ┌────────────┐ │ │ ▼ │
│ │ Views │ │ │ ┌──────────────┐ │
│ └────────────┘ │ │ │ 自动API文档 │ │
│ │ │ └──────────────┘ │
│ 需要自行集成: │ │ │
│ - ORM (SQLAlchemy) │ │ 需要自行集成: │
│ - 表单 (WTForms) │ │ - ORM (SQLAlchemy) │
│ - 认证 (Flask-Login)│ │ - 后台管理 (需自己写) │
│ - 后台管理 (Flask-Admin) │ - 用户认证 │
└─────────────────────┘ └─────────────────────────┘
四、为什么新手更适合 Django?关键决策维度对比表
| 维度 | Django | Flask | FastAPI | 对新手的影响 |
|---|---|---|---|---|
| 学习曲线 | 陡但平坦化 | 平缓 | 中等 | Django 先难后易,但避免走弯路 |
| 项目启动速度 | 5分钟完成用户系统 | 需选型集成 | 需集成ORM | Django 最快产出成品 |
| 数据库操作 | 自带ORM,无需写SQL | 需安装SQLAlchemy | 需安装SQLAlchemy | Django 零配置上手 |
| 表单验证 | 内置 Forms | 需 WTForms | Pydantic(但偏API) | Django 自带CSRF、验证 |
| 用户认证 | 完整会话/权限系统 | 需 Flask-Login | 需 FastAPI-Users | Django 15分钟搞定登录 |
| 后台管理 | ⭐ 自动生成 admin | 需 Flask-Admin | 无 | Django 独有优势 |
| 安全性 | 防XSS/CSRF/SQL注入默认开启 | 需手动配置 | 需手动配置 | Django 开箱即安全 |
| API支持 | DRF/Django Ninja | Flask-RESTful | 原生支持 | FastAPI 做API强,但Django也能 |
| 异步支持 | 3.0+ 部分支持 | 受限 | 原生 async/await | 一般项目不需要异步 |
| 招聘难度 | 最多岗位 | 较多 | 新兴但增长快 | 国内Django岗位更多 |
五、控制台输出对比:创建第一个项目的体验
Django 创建项目与运行
$ pip install django
$ django-admin startproject myproject
$ cd myproject
$ python manage.py startapp blog
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying sessions.0001_initial... OK
$ python manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password:
Password (again):
Superuser created successfully.
$ python manage.py runserver
System check identified no issues (0 silenced).
Django version 5.0, using settings 'myproject.settings'
Starting development server at http://127.0.0.1:8000/
这时你已经拥有:
-
用户认证系统
-
后台管理界面 (http://localhost:8000/admin)
-
SQLite数据库
-
Session管理
-
安全中间件
Flask 同等功能的步骤
$ pip install flask flask-sqlalchemy flask-login wtforms
# 然后手动创建 app.py,手动配置所有扩展,手动写用户模型...
# 大约需要 100+ 行代码才能达到 Django 5分钟的成果
六、一个实际场景:快速开发后台管理系统
假设你需要为书店开发一个图书管理后台,让管理员可以增删改查书籍。
Django 实现(只需3步)
1. 定义模型 (models.py)
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
price = models.DecimalField(max_digits=6, decimal_places=2)
stock = models.IntegerField(default=0)
def __str__(self):
return self.title
2. 注册到后台 (admin.py)
from django.contrib import admin
from .models import Book
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'price', 'stock')
search_fields = ('title', 'author')
3. 执行迁移并运行
$ python manage.py makemigrations
Migrations for 'bookshelf':
bookshelf/migrations/0001_initial.py
- Create model Book
$ python manage.py migrate
Applying bookshelf.0001_initial... OK
$ python manage.py runserver
访问 http://localhost:8000/admin,你会看到一个功能完整的后台:
┌─────────────────────────────────────────┐
│ Django administration │
├─────────────────────────────────────────┤
│ BOOKSHELF │
│ ┌────────────────────────────────────┐ │
│ │ + Add Books │ │
│ │ ┌──────────────────────────────┐ │ │
│ │ │ Title │ Author │ Price │Stock│ │
│ │ │ The Great│Fitzgerald│10.99 │ 5 │ │
│ │ │ 1984 │Orwell │ 9.99 │ 3 │ │
│ │ └──────────────────────────────┘ │ │
│ └────────────────────────────────────┘ │
└─────────────────────────────────────────┘
Flask 实现同样的功能需要:
-
Flask-Admin 扩展
-
WTForms 定义表单
-
Flask-Login 做登录
-
手动编写登录页面
-
手写 CRUD 路由
-
约 200+ 行代码
七、什么时候不选 Django?
| 场景 | 推荐框架 | 原因 |
|---|---|---|
| 纯API后端 + 前后端分离 + 高并发 | FastAPI | 异步性能、自动文档、类型安全 |
| 极简微服务(<10个接口) | Flask | 轻量,启动快,内存占用低 |
| 实时聊天/WebSocket密集 | FastAPI 或 Quart | 原生 ASGI 支持 |
| 已有现成SQLAlchemy代码 | Flask 或 FastAPI | 避免ORM切换成本 |
| 机器学习模型服务 | FastAPI | 异步推理 + 自动文档 |
| 完整企业级ERP/CRM | Django | 自带工作流、权限、Admin |
八、给新手的最终建议
如果你面临以下情况 → 选择 Django:
✅ 刚学 Python 3-6 个月
✅ 想快速做出一个完整的网站(博客、电商、管理系统)
✅ 需要一个好用的后台管理界面
✅ 希望安全、ORM、表单、认证都内置
✅ 目标是找 Python Web 开发工作(国内岗位多)
如果你面临以下情况 → 学完 Django 后再学 Flask/FastAPI:
✅ 已有 Django 基础,想理解微服务
✅ 项目需要极致性能(每秒 > 1万请求)
✅ 开发纯 API 服务给前端/移动端调用
✅ 想体验现代异步 Python
九、一个经典误区澄清
误区:“Django 太重量级,小项目用 Flask 更合适”
真相:Django 也可以只使用部分组件。你的 INSTALLED_APPS 可以只保留:
INSTALLED_APPS = [
'django.contrib.contenttypes', # 需要
'django.contrib.auth', # 可选
# 'django.contrib.admin', # 注释掉
# 'django.contrib.sessions', # 纯API可注释
# 'django.contrib.messages', # 注释掉
'rest_framework', # 如果写API
'myapp',
]
这样 Django 就变得非常轻量,同时保留 ORM 和迁移系统。
十、总结流程图
开始一个新的Web项目
│
▼
是否需要后台管理界面? ────────Yes─────────▶ 选择 Django
│
No
▼
主要开发API + 前后端分离?
│
Yes
▼
是否需要每秒 > 5000 请求? ───Yes───▶ 选择 FastAPI
│
No
▼
是否需要自动API文档? ───────Yes───▶ 选择 FastAPI
│
No
▼
项目是否很小(<5个路由)? ───Yes───▶ 选择 Flask
│
No
▼
团队熟悉哪个框架? ──────────────▶ 选熟悉的
│
No clear answer
▼
选择 Django —— 最稳妥,日后可拆分API服务
记住: 选择框架不是终身大事。Django 学到的东西(MVT、ORM、中间件、表单处理)在学其他框架时完全可迁移。绝大多数项目用 Django 都不会错,它被 Instagram、Pinterest、华盛顿邮报等大型网站验证过。
下一步建议: 跟着本专栏一步步学习,还可以去公众号、今日头条搜索「IT策士」,一起升级 IT 思维 !