作者IT策士10余年一线大厂经验专注 IT 思维、架构、职场进阶。我会在公众号、今日头条持续发布最新文章助你少走弯路。当你准备开始一个 Web 项目时面对 Django、Flask、FastAPI 这三个主流 Python 框架很容易陷入选择困难。本文将通过实际代码、控制台输出、架构对比帮你理清思路。一、一句话总结核心差异框架定位一句话Django全栈大而全自带一切开箱即用适合大型项目Flask微型灵活极简内核需自己组装组件适合小型项目FastAPI高性能现代异步、自动文档、类型提示适合 API 服务二、一个最简单的例子三框架实现“用户注册”场景实现用户注册接口存入数据库返回 JSON。1. Django 实现# models.pyfrom django.dbimportmodels class User(models.Model): usernamemodels.CharField(max_length80,uniqueTrue)emailmodels.EmailField()passwordmodels.CharField(max_length128)# 真实项目中请加密# views.pyfrom django.httpimportJsonResponse from django.views.decorators.csrfimportcsrf_exemptimportjson csrf_exempt def register(request):ifrequest.methodPOST:datajson.loads(request.body)userUser.objects.create(usernamedata[username],emaildata[email],passworddata[password])returnJsonResponse({id:user.id,username:user.username},status201)运行效果$ python manage.py runserver Watchingforfilechanges with StatReloader Performing system checks... System check identified no issues(0silenced). September15,2024-12:00:00 Django version5.0, using settingsmyproject.settingsStarting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.请求与响应$curl-XPOST http://localhost:8000/register/\-HContent-Type: application/json\-d{username:alice,email:aliceexample.com,password:123}# 响应{id:1,username:alice}2. Flask 实现from flaskimportFlask, request, jsonify from flask_sqlalchemyimportSQLAlchemy appFlask(__name__)app.config[SQLALCHEMY_DATABASE_URI]sqlite:///users.dbdbSQLAlchemy(app)class User(db.Model):iddb.Column(db.Integer,primary_keyTrue)usernamedb.Column(db.String(80),uniqueTrue)emaildb.Column(db.String(120))passworddb.Column(db.String(128))app.route(/register,methods[POST])def register(): datarequest.get_json()userUser(usernamedata[username],emaildata[email],passworddata[password])db.session.add(user)db.session.commit()returnjsonify({id:user.id,username:user.username}),201if__name____main__:app.run(debugTrue)运行效果$ python app.py * Serving Flask appapp* Debug mode: on * Running on http://127.0.0.1:5000 Press CTRLC to quit3. FastAPI 实现from fastapiimportFastAPI, HTTPException from pydanticimportBaseModel from sqlalchemyimportcreate_engine, Column, String, Integer from sqlalchemy.ext.declarativeimportdeclarative_base from sqlalchemy.ormimportsessionmaker appFastAPI()enginecreate_engine(sqlite:///users.db)SessionLocalsessionmaker(bindengine)Basedeclarative_base()class UserDB(Base): __tablename__usersidColumn(Integer,primary_keyTrue)usernameColumn(String(80),uniqueTrue)emailColumn(String(120))passwordColumn(String(128))Base.metadata.create_all(bindengine)class UserCreate(BaseModel): username: str email: str password: str app.post(/register,response_modeldict)async def register(user: UserCreate): dbSessionLocal()new_userUserDB(usernameuser.username,emailuser.email,passworduser.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--reloadINFO: Started server process[12345]INFO: Waitingforapplication 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关键决策维度对比表维度DjangoFlaskFastAPI对新手的影响学习曲线陡但平坦化平缓中等Django 先难后易但避免走弯路项目启动速度5分钟完成用户系统需选型集成需集成ORMDjango 最快产出成品数据库操作自带ORM无需写SQL需安装SQLAlchemy需安装SQLAlchemyDjango 零配置上手表单验证内置 Forms需 WTFormsPydantic但偏APIDjango 自带CSRF、验证用户认证完整会话/权限系统需 Flask-Login需 FastAPI-UsersDjango 15分钟搞定登录后台管理⭐ 自动生成 admin需 Flask-Admin无Django 独有优势安全性防XSS/CSRF/SQL注入默认开启需手动配置需手动配置Django 开箱即安全API支持DRF/Django NinjaFlask-RESTful原生支持FastAPI 做API强但Django也能异步支持3.0 部分支持受限原生 async/await一般项目不需要异步招聘难度最多岗位较多新兴但增长快国内Django岗位更多五、控制台输出对比创建第一个项目的体验Django 创建项目与运行$ pipinstalldjango $ django-admin startproject myproject $cdmyproject $ 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: adminexample.com Password: Password(again): Superuser created successfully. $ python manage.py runserver System check identified no issues(0silenced). Django version5.0, using settingsmyproject.settingsStarting development server at http://127.0.0.1:8000/这时你已经拥有用户认证系统后台管理界面 (http://localhost:8000/admin)SQLite数据库Session管理安全中间件Flask 同等功能的步骤$ pipinstallflask flask-sqlalchemy flask-login wtforms# 然后手动创建 app.py手动配置所有扩展手动写用户模型...# 大约需要 100 行代码才能达到 Django 5分钟的成果六、一个实际场景快速开发后台管理系统假设你需要为书店开发一个图书管理后台让管理员可以增删改查书籍。Django 实现只需3步1. 定义模型 (models.py)from django.dbimportmodels class Book(models.Model): titlemodels.CharField(max_length200)authormodels.CharField(max_length100)pricemodels.DecimalField(max_digits6,decimal_places2)stockmodels.IntegerField(default0)def __str__(self):returnself.title2. 注册到后台 (admin.py)from django.contribimportadmin from .modelsimportBook admin.register(Book)class BookAdmin(admin.ModelAdmin): list_display(title,author,price,stock)search_fields(title,author)3. 执行迁移并运行$ python manage.py makemigrations Migrationsforbookshelf: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/CRMDjango自带工作流、权限、Admin八、给新手的最终建议如果你面临以下情况 → 选择 Django ✅ 刚学 Python3-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,# 如果写APImyapp,]这样 Django 就变得非常轻量同时保留 ORM 和迁移系统。十、总结流程图开始一个新的Web项目 │ ▼ 是否需要后台管理界面 ────────Yes─────────▶ 选择 Django │ No ▼ 主要开发API 前后端分离 │ Yes ▼ 是否需要每秒5000请求 ───Yes───▶ 选择 FastAPI │ No ▼ 是否需要自动API文档 ───────Yes───▶ 选择 FastAPI │ No ▼ 项目是否很小5个路由 ───Yes───▶ 选择 Flask │ No ▼ 团队熟悉哪个框架 ──────────────▶ 选熟悉的 │ Noclearanswer ▼ 选择 Django —— 最稳妥日后可拆分API服务记住选择框架不是终身大事。Django 学到的东西MVT、ORM、中间件、表单处理在学其他框架时完全可迁移。绝大多数项目用 Django 都不会错它被 Instagram、Pinterest、华盛顿邮报等大型网站验证过。下一步建议跟着本专栏一步步学习还可以去公众号、今日头条搜索「IT策士」一起升级 IT 思维