当前位置: 首页 > news >正文

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 quit

3. 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?关键决策维度对比表

维度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 创建项目与运行

$ 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.title

2. 注册到后台 (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.993│ │ │ │ └──────────────────────────────┘ │ │ │ └────────────────────────────────────┘ │ └─────────────────────────────────────────┘

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',# 如果写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 思维 !

http://www.jsqmd.com/news/813002/

相关文章:

  • 7个核心步骤构建企业级osquery监控架构:从基础部署到战略级安全分析
  • VSCode AI编程助手AIDE:代码生成、转换与智能开发实战
  • Tenda BE5100三装Mesh Wi-Fi系统评测:价格实惠、速度快,覆盖大空间!
  • 2026全自动超声波清洗机厂家推荐:工业超声波清洗机源头工厂+半导体超声波清洗机厂家推荐精选 - 栗子测评
  • NeoPixel灯环故障深度修复:从信号完整性到电源设计的嵌入式实践
  • 2026年4月市面上做得好的混凝土厂家推荐,技术好的混凝土推荐分析 - 品牌推荐师
  • GTA5mod整合包下载分享(已汉化+自带修改器)2026最新版本
  • Windows 11终极性能调优指南:一键告别卡顿,重获流畅体验 [特殊字符]
  • AI智能体安全防护实战:Crawdad三层防御体系详解
  • OrgAgent:像经营公司一样组织你的多智能体系统
  • 2026耐用塑料托盘厂家盘点:立体库塑料托盘厂家+仓储塑料托盘厂家+货架塑料托盘厂家合集 - 栗子测评
  • 无边界感知:镜像视界Pixel-to-Space驱动跨摄像机全域目标永续追踪
  • 2026山东银杉白水泥供应商:山东瓷砖胶原材料供应商+纤维素醚经销商+山东自流平原材料供应商汇总 - 栗子测评
  • 2026年比较好的液冷板推荐厂家精选 - 品牌宣传支持者
  • 使用S32 Design Studio(S32DS)常见问题
  • 2026性价比高的物联网水表厂家推荐:物联网水表源头工厂+智能水表生产厂家推荐榜单,性价比高的智能水表推荐 - 栗子测评
  • 利用Taotoken的Token Plan为长期单片机研究项目锁定优惠成本
  • 专业环保公司哪家好?2026环保设备生产厂家精选:反渗透设备制造商+智慧环保系统提供商+MBR.RO膜生产RRZ品牌代理 - 栗子测评
  • 内存优化核心技术:缓存、预取与数据结构实战
  • Manim数学动画制作完全指南:从零基础到专业创作
  • 2026年4月桥架供应厂家推荐,热镀锌桥架/桥架/梯式桥架/密集型母线槽/插接式母线槽/不锈钢桥架,桥架供应商怎么选择 - 品牌推荐师
  • 2026山东全品类墙体保温原材料经销商:胶粉供应商+乳胶粉经销商+腻子粉原材料经销商大全 - 栗子测评
  • 接入taotoken服务后stm32设备端api调用量的可视化分析
  • 2026窑炉废气治理设备厂家指南:高温烟气治理厂家+垃圾焚烧烟气治理厂家+窑炉纯氧燃烧系统厂家盘点 - 栗子测评
  • 智能水表哪个品牌好?智能水表哪家好?智能水表哪家质量好?2026智能水表品牌推荐:荣现仪表测评 - 栗子测评
  • Linux 中的 shell 脚本支持使用宏定义吗?
  • 基于Excel实现多层感知机(MLP)前向传播计算过程详解
  • WSL启动器openclaw-wsl-launcher:一键管理Linux开发环境
  • 2026 实操教程|OpenClaw(小龙虾)Windows11 一键部署,多模型适配零基础落地
  • Windows on ARM:从技术预言到生态重塑的十年架构演进