Django 零基础入门:为什么选择 Django 而不是 Flask/FastAPI?

0 阅读6分钟

作者: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?关键决策维度对比表

维度DjangoFlaskFastAPI对新手的影响
学习曲线陡但平坦化平缓中等Django 先难后易,但避免走弯路
项目启动速度5分钟完成用户系统需选型集成需集成ORMDjango 最快产出成品
数据库操作自带ORM,无需写SQL需安装SQLAlchemy需安装SQLAlchemyDjango 零配置上手
表单验证内置 Forms需 WTFormsPydantic(但偏API)Django 自带CSRF、验证
用户认证完整会话/权限系统需 Flask-Login需 FastAPI-UsersDjango 15分钟搞定登录
后台管理⭐ 自动生成 admin需 Flask-AdminDjango 独有优势
安全性防XSS/CSRF/SQL注入默认开启需手动配置需手动配置Django 开箱即安全
API支持DRF/Django NinjaFlask-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/

这时你已经拥有:

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/CRMDjango自带工作流、权限、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 思维 !