Django 零基础入门:为什么选择 Django 而不是 Flask/FastAPI?
作者:IT策士
10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在公众号、今日头条持续发布最新文章,助你少走弯路。
当你准备开始一个 Web 项目时,面对 Django、Flask、FastAPI 这三个主流 Python 框架,很容易陷入选择困难。本文将通过实际代码、控制台输出、架构对比,帮你理清思路。
一、一句话总结核心差异
| 框架 | 定位 | 一句话 |
|---|---|---|
| Django | 全栈大而全 | 自带一切,开箱即用,适合大型项目 |
| Flask | 微型灵活 | 极简内核,需自己组装组件,适合小型项目 |
| FastAPI | 高性能现代 | 异步、自动文档、类型提示,适合 API 服务 |
二、一个最简单的例子:三框架实现“用户注册”
场景:实现用户注册接口,存入数据库,返回 JSON。
1. Django 实现
# models.pyfrom django.dbimportmodels class User(models.Model): username=models.CharField(max_length=80,unique=True)email=models.EmailField()password=models.CharField(max_length=128)# 真实项目中请加密# views.pyfrom django.httpimportJsonResponse from django.views.decorators.csrfimportcsrf_exemptimportjson @csrf_exempt def register(request):ifrequest.method=='POST':data=json.loads(request.body)user=User.objects.create(username=data['username'],email=data['email'],password=data['password'])returnJsonResponse({'id':user.id,'username':user.username},status=201)运行效果:
$ 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 settings'myproject.settings'Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.请求与响应:
$curl-XPOST 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 flaskimportFlask, request, jsonify from flask_sqlalchemyimportSQLAlchemy 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()returnjsonify({'id':user.id,'username':user.username}),201if__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 quit3. FastAPI 实现
from fastapiimportFastAPI, HTTPException from pydanticimportBaseModel from sqlalchemyimportcreate_engine, Column, String, Integer from sqlalchemy.ext.declarativeimportdeclarative_base from sqlalchemy.ormimportsessionmaker 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--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?关键决策维度对比表
| 维度 | 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 创建项目与运行
$ 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: admin@example.com Password: Password(again): Superuser created successfully. $ python manage.py runserver System check identified no issues(0silenced). Django version5.0, using settings'myproject.settings'Starting 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): 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):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 Migrationsfor'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: ✅ 刚学 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',# 如果写API'myapp',]这样 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 思维 !
