Django 概览
这一课你将能做到
- 说清楚 Django 是什么、解决什么问题、与 Flask/FastAPI/Spring Boot 的差异
- 在本机用 venv + pip 装出 Django 5.x 环境,跑通
runserver 并看到欢迎页
- 解释 MTV 架构中 Model、Template、View 各自承担的职责,并能在一次 HTTP 请求里指出它们的位置
为什么要学
如果你想用 Python 写 Web 后端,Django 是绕不开的一个选项。它从 2005 年诞生至今,一直在 Instagram、Pinterest、华盛顿邮报这种体量的产品上服役。和 Flask「给你一把螺丝刀自己造」不同,Django 是「开箱即用的整套工具箱」——ORM、模板、表单、Admin 后台、认证、Session、CSRF 防护、国际化,全部自带。
人话:用 Flask 写项目像买毛坯房自己装修,自由但要自己做水电;用 Django 像买精装房,水电齐全,进来就能住,但你得接受开发商定好的格局。
和本站的关系:本站后端是 Spring Boot + 前后端分离架构,前端 React 通过 REST API 与 Java 通信。Django 既能做同样的事(配合 DRF 出 REST API),也能一把梭——用模板直接渲染 HTML 返回浏览器,省掉前端框架。理解 Django 是理解「全栈式 Web 框架」这条技术路线的最佳入口。
先建立图像
一次 HTTP 请求在 Django 里的旅程(MTV):
浏览器 Django 项目 数据库
│ │ │
│ GET /articles/5 │ │
├──────────────────────>│ │
│ urls.py 路由匹配 │
│ │ │
│ views.py 视图函数 │
│ │ Article.objects.get(id=5) │
│ ├─────────────────────────────>│
│ │<── 返回 Article 实例 ────────│
│ │ │
│ templates/article.html 渲染 │
│ │ │
│ <html>...</html> │ │
│<──────────────────────│ │
对比 Spring Boot:
| 角色 | Django | Spring Boot |
|---|
| 路由 | urls.py 的 path() | @GetMapping 注解 |
| 控制器/视图 | views.py 函数或类 | @RestController |
| 数据模型 | models.py + ORM | @Entity + JPA/Hibernate |
| 模板渲染 | DTL(内置) | Thymeleaf(可选,常用前后端分离) |
| 后台管理 | 自带 Admin | 无内置,需自己写或用第三方 |
跟着做
步骤 1:确认 Python 版本
Django 5.x 要求 Python 3.10+,建议 3.11 或 3.12:
python --version
# Python 3.12.4
步骤 2:创建虚拟环境
不要把 Django 装到系统 Python 里。每个项目独立一个虚拟环境:
# Windows PowerShell
mkdir django-demo
cd django-demo
python -m venv .venv
.\.venv\Scripts\Activate.ps1
# macOS / Linux
mkdir django-demo && cd django-demo
python3 -m venv .venv
source .venv/bin/activate
步骤 3:安装 Django 并验证
pip install "Django>=5.0,<5.2"
python -m django --version
# 5.1.x
步骤 4:创建项目并启动
django-admin startproject mysite .
python manage.py migrate
python manage.py runserver
打开浏览器访问 http://127.0.0.1:8000/,看到 Django 火箭页就说明环境 OK。
migrate 这一步会创建 db.sqlite3 文件——Django 默认用 SQLite 作为开发数据库,零配置直接可用。
步骤 5:写第一个视图
from django.http import HttpResponse
from datetime import datetime
def hello(request):
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return HttpResponse(f"<h1>Hello Django</h1><p>当前时间:{now}</p>")
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path("admin/", admin.site.urls),
path("hello/", views.hello, name="hello"),
]
重启 runserver(其实它会自动重载),访问 http://127.0.0.1:8000/hello/,能看到带时间的问候语——你已经走完一次完整的「URL → View → Response」流程。
步骤 6:探索自带 Admin
python manage.py createsuperuser
# 按提示输入用户名、邮箱、密码
访问 http://127.0.0.1:8000/admin/,用刚创建的账号登录。你会看到一个用户/组管理界面——这是 Django 框架免费送的,没写一行业务代码。
讲清楚要点
- Django 是「batteries-included」框架:ORM、模板、表单、Admin、认证、Session、迁移、缓存、国际化、CSRF/XSS 防护全在官方包里。Flask 是微框架,只给你路由 + 请求/响应抽象,其他靠扩展。
- MTV ≈ MVC,只是命名不同:Django 的 View 对应 MVC 的 Controller,Template 对应 MVC 的 View,Model 就是 MVC 的 Model。别被术语绕晕。
manage.py 是项目命令入口:启动服务、建迁移、创建超级用户、跑测试,全走它。它本质上是对 django-admin 的项目级封装。
- 默认开发栈零配置:SQLite + 内置开发服务器,让你专注业务,不必先折腾 MySQL/Nginx。生产再换 PostgreSQL + Gunicorn。
- Django 既能全栈渲染 HTML,也能配合 DRF 做纯 API 后端:与 Spring Boot 前后端分离架构完全等价。本站(Spring Boot + React)就是后者这种形态。
- 「显式优于隐式」是 Python 哲学,但 Django 例外:Django 大量用「约定优于配置」——模板放
templates/、静态文件放 static/、迁移文件自动按序号命名。遵循约定可省 80% 配置。
你可能会懵的地方
-
Django 和 Flask/FastAPI 怎么选?
全栈 CRUD 站、内部管理系统、内容站:选 Django。微服务、纯 API 网关、需要极致性能:选 FastAPI。介于两者之间想自己组装:Flask。面试别答「看情况」,要说出具体场景。
-
django-admin 和 manage.py 啥区别?
django-admin 是全局命令,manage.py 是项目里那份,自动带上 DJANGO_SETTINGS_MODULE 环境变量。项目里只用 manage.py。
-
migrate 到底干了啥?
把 django.contrib.* 这些内置 app 的初始迁移(用户表、session 表等)跑到数据库里。输出里能看到 Applying contenttypes.0001_initial... OK。
-
为什么默认端口是 8000?
约定俗成。可以用 python manage.py runserver 8080 改。Spring Boot 默认 8080,别在同一台机器同时启动冲突。
-
生产环境能直接用 runserver 吗?
不能。它是单线程开发服务器,没做安全加固。生产用 Gunicorn/Uvicorn + Nginx。第 11 课会专门讲部署。
错法对照
| 错法 | 问题 | 正解 |
|---|
全局 pip install django | 多项目版本互相污染 | 每个项目一个 venv |
把 views.py 建在项目根目录 | 找不到模块 | 视图放在 app 目录或项目包内 |
path("hello", ...) 漏斜杠 | Django 会自动 APPEND_SLASH 跳转,不一致 | URL 统一以 / 结尾 |
HttpResponse 直接返回 dict | 不是合法响应类型 | 用 JsonResponse(data) 或模板渲染 |
用 print 调试视图 | 输出到控制台但响应无关 | 用 logging 或 django-debug-toolbar |
卡点急救
ModuleNotFoundError: No module named 'django':虚拟环境没激活,或激活了但 pip 装到了别的环境。pip list | grep Django 验证。
- 访问
127.0.0.1:8000 一直转圈:端口被占。Windows 用 netstat -ano | findstr :8000 找进程,或直接换端口 runserver 8001。
- 改了代码浏览器没变化:开发服务器有时不会重启。Ctrl+C 后重启。仍不行就强制刷新(Ctrl+F5)清浏览器缓存。
面试常问
-
Django 的 MTV 是什么?和 MVC 什么关系?
M(Model)管数据,T(Template)管展示,V(View)管业务逻辑。和 MVC 同构:Django 的 View ≈ MVC 的 Controller,Template ≈ MVC 的 View。本质是「框架本身已经充当了 Controller 的一部分(URL 分发)」。
-
Django 的「batteries-included」体现在哪?
ORM + 迁移、模板引擎、表单校验、Admin 后台、用户认证、Session、CSRF/XSS 防护、缓存、国际化、信号系统、测试框架。一句话:从接收请求到返回响应,整条链路官方都有解决方案。
-
Django 适合做微服务吗?
可以但不首选。Django 进程较重、启动慢、依赖 Django 全家桶约定。微服务场景一般用 FastAPI/Flask 写轻服务,把 Django 留给「需要后台管理 + 复杂业务逻辑」的核心服务。
自测三问
- Django 的 MTV 三个字母分别指什么?各自负责什么?
- 为什么推荐每个 Django 项目都用独立虚拟环境?
- Django 和 Spring Boot 在「渲染 HTML」这件事上的默认取向有什么差异?
小结一句话
Django 是 Python 生态里功能最全的 Web 框架,用「约定优于配置」换开发速度,既能全栈渲染 HTML,也能配 DRF 做纯 API 后端。
延伸