Article

后端框架 Django

更新于:2026-07-13

第一章:Django 入门与环境搭建

1.1 Django 简介与特点

方法/概念名称语法/说明用途代码示例注意事项
MTV 架构Model-Template-ViewDjango 的设计模式,分离数据、展示与逻辑无具体代码区别于 MVC,View 相当于 Controller,Template 是视图展示
高层抽象内置功能丰富快速开发 Web 应用,避免重复造轮子无具体代码包含 ORM、Admin、Auth 等开箱即用组件
可扩展性支持插件与第三方包灵活集成新功能pip install django-extensions可通过 pip 安装大量社区贡献工具
安全性防 CSRF、SQL 注入等保护应用安全{% csrf_token %} 在表单中自动启用默认启用常见安全机制,减少人为错误
管理后台自动生成 admin 界面快速实现数据管理python manage.py createsuperuser无需额外开发即可拥有功能完整的后台系统

1.2 安装 Django 与版本管理

方法名称语法用途代码示例注意事项
pip installpip install django安装最新版 Djangopip install django建议在虚拟环境中执行
指定版本安装pip install django==4.2.7安装特定版本 Djangopip install django==3.2版本需符合项目或教程要求
查看版本python -m django --version验证 Django 是否安装成功python -m django --version若报错说明未正确安装或路径问题
虚拟环境创建python -m venv myenv创建独立 Python 环境python -m venv venv推荐每个项目使用独立虚拟环境
激活虚拟环境(Windows)myenv\Scripts\activate激活虚拟环境venv\Scripts\activate激活后命令行前缀会显示环境名
激活虚拟环境(macOS/Linux)source myenv/bin/activate激活虚拟环境source venv/bin/activate使用 source 命令加载环境变量
退出虚拟环境deactivate退出当前虚拟环境deactivate恢复使用系统默认 Python 环境

1.3 创建第一个 Django 项目

方法名称语法用途代码示例注意事项
django-admin startprojectdjango-admin startproject 项目名创建新的 Django 项目django-admin startproject mysite可在任意目录执行
manage.py startprojectpython manage.py startproject 项目名通过管理脚本创建项目python manage.py startproject blog .加点表示在当前目录创建,不嵌套
项目命名规则小写字母、下划线、不能是 Python 关键字避免命名冲突my_project, blog_site不要用 classdef 等关键字作为项目名
目录切换cd 项目目录进入项目根目录cd mysite后续操作通常在此目录下进行

1.4 项目结构解析

文件/目录名路径用途示例内容注意事项
manage.py项目根目录Django 命令行工具python manage.py runserver不要修改此文件,用于执行各类管理命令
settings.py项目名/settings.py项目配置文件DEBUG = True, INSTALLED_APPS包含数据库、应用、静态文件等核心设置
urls.py项目名/urls.py根 URL 配置urlpatterns = [...]所有 URL 的入口,可 include 其他应用路由
wsgi.py项目名/wsgi.pyWSGI 部署接口用于生产环境服务器通信通常无需修改
asgi.py项目名/asgi.pyASGI 异步接口(Django 3.0+)支持 WebSocket 等异步协议用于异步部署场景
__init__.py项目名/__init__.py标识为 Python 包可为空确保 Django 模块可被导入

1.5 启动开发服务器

方法名称语法用途代码示例注意事项
runserverpython manage.py runserver启动内置开发服务器python manage.py runserver默认监听 127.0.0.1:8000
指定端口python manage.py runserver 8080更改服务器端口python manage.py runserver 8080适用于端口被占用时
指定 IPpython manage.py runserver 0.0.0.0:8000允许外部访问python manage.py runserver 0.0.0.0:8000用于局域网调试,注意安全
自动重载开启状态下修改代码自动重启提高开发效率无需手动命令开发服务器默认启用
关闭服务器Ctrl + C终止服务器进程在终端按 Ctrl+C正常关闭,避免端口占用问题
检查配置python manage.py check验证项目配置正确性python manage.py check可在启动前运行以排查错误

第二章:URL 路由与视图

2.1 URL 路由配置(urls.py)

方法名称语法用途代码示例注意事项
pathpath(route, view, kwargs=None, name=None)定义简洁 URL 路由path('home/', views.home, name='home')route 以路径形式书写,不使用正则
re_pathre_path(route, view, kwargs=None, name=None)使用正则表达式定义复杂路由re_path(r'^article/(\d+)/$', views.article_detail)需导入 re_path,支持捕获组传参
includeinclude('app.urls')引入应用级 URL 配置path('blog/', include('blog.urls'))实现模块化,避免主路由臃肿
URLPattern自定义类继承高级用法,自定义路由逻辑一般不直接使用框架底层机制,开发者较少直接操作
app_nameapp_name = 'blog'设置应用命名空间在应用 urls.py 中定义配合命名 URL 使用,避免冲突

2.2 视图函数(View Functions)

方法名称语法用途代码示例注意事项
视图函数定义def view_name(request, *args, **kwargs):处理 HTTP 请求并返回响应def index(request): return HttpResponse("Hello")第一个参数必须是 request
HttpResponseHttpResponse(content, content_type, status)返回 HTTP 响应return HttpResponse("OK", status=200)最基础响应类,用于返回字符串内容
renderrender(request, template_name, context)渲染模板并返回return render(request, 'index.html', {'data': data})自动使用 RequestContext
redirectredirect(to, *args, **kwargs)执行 HTTP 重定向return redirect('home')redirect('/home/')to 可为 URL 名称或绝对路径
HttpResponseRedirectHttpResponseRedirect('/url/')显式返回 302 重定向return HttpResponseRedirect('/success/')与 redirect 功能类似,但需手动指定 URL

2.3 类视图(Class-Based Views)基础

方法名称语法用途代码示例注意事项
as_viewClassName.as_view()将类视图转换为可调用视图函数path('home/', MyView.as_view())URL 路由中必须调用此方法
dispatchdef dispatch(self, request, *args, **kwargs)分发请求到对应处理方法return super().dispatch(request, ...)可用于权限检查或日志记录
getdef get(self, request, *args, **kwargs)处理 GET 请求def get(self, request): ...类视图中处理 GET 的标准方法
postdef post(self, request, *args, **kwargs)处理 POST 请求def post(self, request): ...接收表单提交等数据
http_method_not_alloweddef http_method_not_allowed(...)处理不支持的 HTTP 方法默认返回 405 状态码可重写自定义行为

2.4 路由参数传递(路径与查询参数)

方法名称语法用途代码示例注意事项
路径参数path('item/<int:id>/', views.detail)从 URL 路径提取参数path('user/<str:username>/')支持类型转换:str, int, slug, uuid 等
查询参数获取request.GET.get('key')获取 URL 查询字符串参数value = request.GET.get('page', 1)GET 是类字典对象,使用 get 安全获取
正则捕获组re_path(r'^page/(\d+)/$', ...)使用正则提取参数re_path(r'^tag/(\w+)/$', views.by_tag)参数按顺序传入视图
命名捕获组re_path(r'^article/(?P<year>\d{4})/$', ...)正则命名捕获参数以关键字传入视图提高可读性,推荐使用
多参数传递path('a/<int:x>/b/<str:y>/')同时传递多个路径参数视图接收 x 和 y 两个参数顺序和名称需匹配

2.5 命名 URL 与 reverse 解析

方法名称语法用途代码示例注意事项
reversereverse(viewname, args=None, kwargs=None)根据名称反向生成 URLurl = reverse('detail', args=[1])常用于视图中重定向
resolveresolve('/some/url/')根据 URL 反解析视图信息match = resolve('/blog/1/')返回 ResolverMatch 对象
{% url %}{% url 'view_name' arg1 arg2 %}模板中生成命名 URL<a href="{% url 'home' %}">Home</a>推荐在模板中使用,避免硬编码
命名空间引用{% url 'app:detail' id=1 %}使用应用命名空间需在 include 时定义 app_name避免不同应用间 URL 名称冲突
redirectredirect('view_name', arg)结合命名 URL 进行重定向return redirect('update', pk=obj.id)比硬编码 URL 更灵活安全

第三章:模板系统(Templates)

3.1 模板创建与加载机制

方法名称语法用途代码示例注意事项
renderrender(request, 'template.html')加载并渲染模板return render(request, 'list.html')Django 自动在 TEMPLATES DIR 中查找
loader.get_templateget_template('name.html')手动加载模板对象t = loader.get_template('index.html')返回 Template 实例,可多次渲染
ContextContext({'key': value})创建模板上下文c = Context({'name': 'Alice'})通常由 render 自动处理
TemplateTemplate("Hello {{ name }}")创建字符串模板t = Template("Hi {{ user }}")用于动态生成模板内容
模板目录配置'DIRS': [BASE_DIR / 'templates']设置模板搜索路径在 settings.py 中配置推荐集中存放模板文件

3.2 模板语法:变量、标签、过滤器

方法名称语法用途代码示例注意事项
变量输出{{ variable }}显示变量值{{ user.name }}自动 HTML 转义防止 XSS
过滤器{{ value|filter:arg }}变换变量输出格式{{ text|truncatechars:30 }}可链式使用多个过滤器
if 标签{% if condition %}...{% endif %}条件判断{% if user.is_authenticated %}...{% endif %}支持 elif 和 else
for 标签{% for item in list %}...{% endfor %}循环遍历{% for post in posts %}...{% endfor %}可用 forloop 变量获取循环信息
with 标签{% with total=10 %}...{% endwith %}创建临时变量{% with name=user.get_name %}...{% endwith %}减少重复计算或调用

3.3 模板继承与块(extends, block)

方法名称语法用途代码示例注意事项
extends{% extends "base.html" %}继承父模板必须是模板第一行内容实现页面结构复用
block{% block title %}...{% endblock %}定义可替换块{% block content %}{% endblock %}子模板中重写该块内容
block.super{{ block.super }}包含父模板块内容{% block title %}{{ block.super }} - Blog{% endblock %}在原有内容基础上追加
include{% include "nav.html" %}嵌入其他模板片段用于复用组件如导航栏不涉及继承关系
重写块{% block content %}新内容{% endblock %}子模板覆盖父块必须在 extends 之后定义可部分保留或完全替换

3.4 静态文件处理(CSS, JS, Images)

方法名称语法用途代码示例注意事项
load static{% load static %}加载静态文件标签{% load static %}必须先加载才能使用 static
static{% static 'path/to/file' %}获取静态文件 URL<link href="{% static 'css/style.css' %}">开发环境自动服务,生产需配置
STATIC_URLSTATIC_URL = '/static/'静态文件 URL 前缀在 settings.py 中设置通常为 /static/
STATICFILES_DIRS配置额外静态文件目录STATICFILES_DIRS = [BASE_DIR / "static"]告诉 Django 哪些目录包含静态文件开发时收集静态文件的来源
collectstaticpython manage.py collectstatic收集所有静态文件到统一目录用于生产环境部署将分散的静态文件复制到 STATIC_ROOT

3.5 模板上下文处理器

方法名称语法用途代码示例注意事项
RequestContextrender(request, ...) 自动使用自动包含处理器变量return render(request, 'index.html')render 已默认使用
自定义处理器def processor(request): return {...}添加全局模板变量def site_name(request): return {'SITE_NAME': 'MySite'}函数需接收 request 并返回 dict
常用内置处理器django.contrib.auth.context_processors.auth提供用户、权限信息可在模板中使用 user, perms默认启用
关闭处理器TEMPLATES['OPTIONS']['context_processors'] 移除禁用特定处理器减少上下文开销仅在确定不需要时关闭
多处理器协作多个处理器返回的 dict 合并构建完整上下文每个处理器负责一部分数据避免键名冲突

第四章:模型(Models)与数据库操作

4.1 模型定义与字段类型

方法名称语法用途代码示例注意事项
CharFieldmodels.CharField(max_length=100)存储短文本字符串name = models.CharField(max_length=50)必须指定 max_length
TextFieldmodels.TextField()存储长文本content = models.TextField()无长度限制,适合文章内容
IntegerFieldmodels.IntegerField()存储整数age = models.IntegerField()不支持小数
FloatFieldmodels.FloatField()存储浮点数price = models.FloatField()注意精度问题
BooleanFieldmodels.BooleanField()存储布尔值active = models.BooleanField(default=True)可设 default 值
DateTimeFieldmodels.DateTimeField()存储日期时间created = models.DateTimeField(auto_now_add=True)auto_now 每次保存更新,auto_now_add 创建时设置
ForeignKeymodels.ForeignKey(OtherModel, on_delete=...)外键关系author = models.ForeignKey(User, on_delete=models.CASCADE)必须指定 on_delete 行为
EmailFieldmodels.EmailField()验证并存储邮箱email = models.EmailField()自动格式验证
ImageFieldmodels.ImageField(upload_to='images/')存储图片文件avatar = models.ImageField(upload_to='avatars/')需安装 Pillow 库

4.2 数据库迁移(migrate, makemigrations)

方法名称语法用途代码示例注意事项
makemigrationspython manage.py makemigrations生成数据库迁移文件python manage.py makemigrations检测模型变更并创建迁移脚本
migratepython manage.py migrate应用迁移到数据库python manage.py migrate执行 SQL 更新数据库结构
showmigrationspython manage.py showmigrations查看迁移状态显示已应用和未应用的迁移帮助诊断问题
sqlmigratepython manage.py sqlmigrate app 0001显示迁移对应的 SQL查看实际执行的 SQL 语句用于调试和学习
—fakepython manage.py migrate --fake标记迁移为已应用但不执行用于同步迁移状态仅在特殊情况下使用
回退迁移python manage.py migrate app_name 0001回退到指定迁移版本撤销后续迁移谨慎操作,可能丢失数据

4.3 ORM 基本操作:增删改查

方法名称语法用途代码示例注意事项
createModel.objects.create(**kwargs)创建并保存对象User.objects.create(name='Alice')一步完成实例化和保存
saveobj.save()保存对象(新建或更新)user.name = 'Bob'; user.save()可触发信号和自定义逻辑
getModel.objects.get(**kwargs)获取单个对象user = User.objects.get(id=1)无结果或多个结果均抛异常
filterModel.objects.filter(**kwargs)查询多个对象users = User.objects.filter(active=True)返回 QuerySet,可链式调用
updateQuerySet.update(**kwargs)批量更新User.objects.filter(...).update(active=False)不调用 save(),不触发信号
deleteobj.delete()QuerySet.delete()删除对象user.delete()根据 on_delete 策略处理关联对象

4.4 查询集(QuerySet)方法详解

方法名称语法用途代码示例注意事项
allModel.objects.all()获取全部对象posts = Post.objects.all()返回惰性查询集
excludeQuerySet.exclude(**kwargs)排除匹配对象Post.objects.exclude(status='draft')逻辑为 NOT
order_byQuerySet.order_by('field')排序结果Post.objects.order_by('-created')- 表示降序
valuesQuerySet.values(*fields)返回字典列表Post.objects.values('title', 'author')轻量数据提取
values_listQuerySet.values_list('field', ...)返回元组列表Post.objects.values_list('id', flat=True)flat=True 用于单字段展平
distinctQuerySet.distinct()去除重复记录Post.objects.distinct('author')依据字段去重
countQuerySet.count()统计数量Post.objects.filter(...).count()比 len() 更高效
first / lastQuerySet.first()获取首个/末个对象Post.objects.filter(...).first()可能返回 None
existsQuerySet.exists()判断是否存在if Post.objects.filter(...).exists():比 count() > 0 更快
select_relatedQuerySet.select_related()预加载外键关联Post.objects.select_related('author')减少 N+1 查询,一对一/多对一

4.5 模型关系:ForeignKey, OneToOneField, ManyToManyField

方法名称语法用途代码示例注意事项
ForeignKeymodels.ForeignKey(To, on_delete=...)多对一关系Post 关联 User 外键on_delete 必填(CASCADE, SET_NULL 等)
OneToOneFieldmodels.OneToOneField(To, ...)一对一关系Profile 关联 User如用户与个人资料
ManyToManyFieldmodels.ManyToManyField(To)多对多关系Book 关联 Author自动创建中间表
addm2m_field.add(obj)多对多添加关联book.authors.add(author)可传多个对象
removem2m_field.remove(obj)移除多对多关联book.authors.remove(author)从关系中删除
clearm2m_field.clear()清空所有关联book.authors.clear()不删除对象本身
setm2m_field.set([obj_list])批量设置关联book.authors.set([a1, a2])替换现有关系
related_nameForeignKey(..., related_name='posts')自定义反向关系名称user.posts.all()避免默认的 modelname_set

4.6 模型元选项(Meta Options)

方法名称语法用途代码示例注意事项
db_tabledb_table = 'custom_name'指定数据库表名db_table = 'blog_posts'覆盖默认表名 app_model
orderingordering = ['field']默认排序字段ordering = ['-created']查询时自动应用
verbose_nameverbose_name = '单数名'人类可读的单数名称verbose_name = '文章'用于 Admin 和文档
verbose_name_pluralverbose_name_plural = '复数名'人类可读的复数名称verbose_name_plural = '文章列表'覆盖默认复数形式
unique_togetherunique_together = [('a', 'b')]字段组合唯一约束确保 a 和 b 的组合唯一已逐渐被 UniqueConstraint 替代
indexesindexes = [models.Index(...)]自定义数据库索引indexes = [Index(fields=['title'])]提升查询性能

4.7 自定义模型 Manager

方法名称语法用途代码示例注意事项
objectsModel.objects默认管理器User.objects.all()所有模型默认拥有
自定义 Managerclass MyManager(models.Manager):创建专用查询接口class PublishedManager(models.Manager): ...继承 models.Manager
get_querysetdef get_queryset(self):重写查询集return super().get_queryset().filter(status='published')控制 manager 返回的数据集
自定义方法def method(self):添加查询方法def recent(self): return self.filter(...)可在 manager 上直接调用
多管理器objects = models.Manager(); published = PublishedManager()为模型添加多个管理器可在不同场景使用不同 manager只有一个是默认 manager

第五章:表单处理(Forms)

5.1 表单类定义(Form, ModelForm)

方法名称语法用途代码示例注意事项
Formclass MyForm(forms.Form):定义普通表单name = forms.CharField(max_length=100)不直接关联模型
ModelFormclass MyModelForm(forms.ModelForm):基于模型生成表单class Meta: model = Post; fields = '__all__'自动生成字段,减少重复
Meta 内部类class Meta: model, fields配置 ModelForm 行为fields = ['title', 'content']exclude = [...]必须指定 model
字段重写field = forms.CharField(...)自定义字段属性title = forms.CharField(widget=forms.Textarea)覆盖 ModelForm 自动生成的字段
自定义字段field = forms.FieldType()添加非模型字段captcha = forms.CharField()用于验证码等附加数据

5.2 表单验证机制

方法名称语法用途代码示例注意事项
cleandef clean(self):验证整个表单数据if pwd != confirm: raise ValidationError在所有字段验证后调用
clean_<field>def clean_<fieldname>(self):验证特定字段def clean_email(self): ...方法名格式为 clean_<字段名>
ValidationErrorraise ValidationError('错误信息')抛出验证错误from django.core.exceptions import ValidationError中断验证流程
内置验证器validators=[MinLengthValidator(8)]添加字段级验证器password = forms.CharField(validators=[validate_password])可组合多个验证器
requiredfield = forms.CharField(required=True)设置字段是否必填默认为 TrueFalse 表示可为空

5.3 在视图中使用表单

方法名称语法用途代码示例注意事项
GET 处理if request.method == 'GET':显示空表单form = MyForm()通常用于首次访问页面
POST 处理elif request.method == 'POST':处理提交数据form = MyForm(request.POST)区分请求方法
is_validif form.is_valid():验证表单数据数据合法后可访问 cleaned_data必须先调用
saveobj = form.save()保存表单数据(ModelForm)obj = form.save(commit=False)commit=False 可延迟保存
cleaned_dataform.cleaned_data['field']获取清洗后的数据title = form.cleaned_data['title']仅在 is_valid() 后可用

5.4 表单模板渲染

方法名称语法用途代码示例注意事项
as_p{{ form.as_p }}以段落形式渲染每个字段包裹在 <p>简单布局
as_table{{ form.as_table }}以表格形式渲染字段作为表格行适合对齐
as_ul{{ form.as_ul }}以列表形式渲染每个字段为 <li>常用于表单列表
手动渲染{{ form.field }}逐个字段控制{{ form.title }} {{ form.title.errors }}灵活性最高
CSRF 标签{% csrf_token %}防止跨站请求伪造必须在 POST 表单中包含安全必需

5.5 文件上传处理

方法名称语法用途代码示例注意事项
FileFieldmodels.FileField(upload_to='files/')模型中定义文件字段在模型中使用需配置 MEDIA 设置
ImageFieldmodels.ImageField(...)专用图像字段需安装 Pillow自动验证图像格式
form.is_multipartform.is_multipart()判断表单是否含文件if form.is_multipart(): ...决定是否用 request.FILES
request.FILESrequest.FILES['file']获取上传文件form = MyForm(request.POST, request.FILES)必须同时传 POST 和 FILES
MEDIA_URLMEDIA_URL = '/media/'用户访问媒体文件的 URL 前缀在 settings.py 中设置开发环境需配置 URL
MEDIA_ROOTMEDIA_ROOT = BASE_DIR / 'media'媒体文件存储的绝对路径服务器上实际文件位置生产环境需静态服务器服务

第六章:用户认证与权限

6.1 用户模型(User)与认证系统

方法名称语法用途代码示例注意事项
create_userUser.objects.create_user(username, email, password)创建普通用户(自动哈希密码)User.objects.create_user('alice', 'a@b.com', 'pass123')不应直接设置 password 字段
authenticateauthenticate(request, username, password)验证用户凭据user = authenticate(username='alice', password='pass')验证成功返回 User 对象,失败返回 None
loginlogin(request, user)登录用户并创建会话login(request, user)需在 authenticate 成功后调用
logoutlogout(request)登出用户并清除会话logout(request)不接收参数,清除 request.session 数据
get_userget_user(request)从会话获取用户对象user = get_user(request)常用于中间件或自定义逻辑

6.2 登录、登出视图

方法名称语法用途代码示例注意事项
LoginViewfrom django.contrib.auth.views import LoginView内置登录视图可继承自定义默认使用 registration/login.html
LogoutViewfrom django.contrib.auth.views import LogoutView内置登出视图配置 URL 即可登出后跳转到 LOGIN_REDIRECT_URL
login_required@login_required装饰器限制访问@login_required def view(...): ...未登录用户重定向到登录页
next 参数?next=/target/登录后跳转目标登录成功后自动跳转原请求页面安全验证目标 URL 是否本站
自定义登录表单class CustomAuthForm(AuthenticationForm):扩展默认登录表单可添加字段或修改验证逻辑需在视图中指定 form_class

6.3 用户注册实现

方法名称语法用途代码示例注意事项
UserCreationFormforms.UserCreationForm内置用户注册表单继承并自定义字段包含用户名、密码1、密码2
UserChangeFormforms.UserChangeForm用于修改用户信息管理后台默认使用更适合用户资料编辑
set_passworduser.set_password('new_pass')安全设置用户密码user.set_password(raw_password)自动哈希,不应直接赋值
save(commit=False)form.save(commit=False)暂不保存到数据库可先修改对象再保存常用于注册时添加额外数据
send_mailfrom django.core.mail import send_mail发送注册确认邮件send_mail(subject, msg, from, to)需配置邮件后端

6.4 权限与组管理

方法名称语法用途代码示例注意事项
Permission模型权限(add, change, delete, view)控制模型操作权限user.has_perm('blog.add_post')自动生成四种基本权限
GroupGroup.objects.create(name='Editor')用户分组管理权限将权限分配给组,用户加入组简化权限管理
user_passes_test@user_passes_test(test_func)基于函数的权限控制@user_passes_test(lambda u: u.is_staff)test_func 接收 user 返回布尔值
has_permuser.has_perm('app.action_model')检查用户是否有权限if request.user.has_perm('polls.change_choice'): ...权限字符串格式为 app_label.action_model
assign_permuser.user_permissions.add(perm)为用户分配权限user.user_permissions.add(permission)可直接操作权限关系

6.5 装饰器控制访问(@login_required 等)

方法名称语法用途代码示例注意事项
login_required@login_required要求用户已登录@login_required def my_view(...): ...未登录跳转至 LOGIN_URL
permission_required@permission_required('polls.change_poll')要求特定权限可设置 raise_exception=True无权限返回 403 或重定向
user_passes_test@user_passes_test(lambda u: u.is_superuser)自定义条件测试更灵活的访问控制可实现复杂逻辑
method_decoratormethod_decorator(dec, name)将函数装饰器用于类视图@method_decorator(login_required, name='dispatch')类视图中使用函数装饰器
staff_member_required@staff_member_required仅限管理员访问装饰管理功能视图基于 is_staff 字段

第七章:高级视图与通用视图

7.1 类视图进阶:ListView, DetailView, CreateView, UpdateView, DeleteView

方法名称语法用途代码示例注意事项
ListViewclass PostList(ListView): model = Post显示对象列表template_name = 'list.html'默认上下文 object_list
DetailViewclass PostDetail(DetailView): model = Post显示单个对象详情context_object_name = 'post'默认使用 pk 或 slug 查找
CreateViewclass PostCreate(CreateView): model = Post; fields = '__all__'创建新对象success_url = reverse_lazy('list')自动处理表单显示与保存
UpdateViewclass PostUpdate(UpdateView): model = Post更新现有对象需提供 pk 或 slug表单预填充原数据
DeleteViewclass PostDelete(DeleteView): model = Post删除对象确认页success_url = '/success/'需用户确认,防止误删

7.2 混合类(Mixins)使用

方法名称语法用途代码示例注意事项
LoginRequiredMixinclass View(LoginRequiredMixin, ...):要求登录才能访问必须放在继承列表左侧比装饰器更适合类视图
PermissionRequiredMixinclass View(PermissionRequiredMixin, ...):要求特定权限permission_required = 'polls.change_poll'无权限返回 403
UserPassesTestMixinclass View(UserPassesTestMixin, ...):自定义测试逻辑def test_func(self): return self.request.user.is_stafftest_func 返回布尔值
SuccessMessageMixinclass View(SuccessMessageMixin, CreateView):添加成功消息success_message = "创建成功!"需配合 messages 框架使用
MultipleObjectMixin用于 ListView 等提供分页、查询集管理通常已内置使用基础混合类

7.3 自定义视图逻辑(get_context_data, form_valid 等)

方法名称语法用途代码示例注意事项
get_context_datadef get_context_data(self, **kwargs):添加额外上下文数据context['extra'] = Value; return context必须调用 super() 获取默认数据
form_validdef form_valid(self, form):处理有效表单提交return super().form_valid(form)可在此添加额外逻辑(如发邮件)
form_invaliddef form_invalid(self, form):处理无效表单提交可记录日志或修改响应默认重新显示表单
get_querysetdef get_queryset(self):自定义查询集return Post.objects.filter(active=True)控制视图获取的数据范围
dispatchdef dispatch(self, request, *args, **kwargs):分发请求前处理return super().dispatch(request, ...)可用于权限检查或日志

7.4 重定向与 HTTP 响应控制

方法名称语法用途代码示例注意事项
HttpResponseRedirectHttpResponseRedirect('/url/')返回 302 重定向return HttpResponseRedirect('/success/')明确指定目标 URL
redirectredirect('view_name', arg)便捷重定向函数return redirect('detail', pk=obj.id)支持 URL 名称和参数
reverse_lazyreverse_lazy('view_name')延迟反向解析 URLsuccess_url = reverse_lazy('home')用于类属性定义,避免导入时求值
HttpResponsePermanentRedirect返回 301 重定向SEO 友好,永久重定向搜索引擎会更新索引用于 URL 永久变更
HttpResponseNotFoundHttpResponseNotFound()返回 404 状态码raise Http404 或 return response也可使用 raise Http404

第八章:中间件(Middleware)

8.1 中间件概念与执行流程

方法名称语法用途代码示例注意事项
__init__def __init__(self, get_response):初始化中间件self.get_response = get_response每个请求前执行一次
__call__def __call__(self, request):处理请求并返回响应response = self.get_response(request); return response核心处理逻辑
process_requestdef process_request(self, request):在视图前处理请求可返回 None 或 HttpResponse返回 HttpResponse 则短路后续
process_responsedef process_response(self, request, response):在响应后处理响应必须返回 HttpResponse 对象所有情况下都会调用
执行顺序MIDDLEWARE 列表顺序决定中间件执行流程上:request,下:responserequest 从上到下,response 从下到上

8.2 常用内置中间件

方法名称语法用途代码示例注意事项
SecurityMiddleware'django.middleware.security.SecurityMiddleware'提供安全防护(如 HSTS)防止 XSS、点击劫持等生产环境强烈建议启用
SessionMiddleware'django.contrib.sessions.middleware.SessionMiddleware'启用会话支持依赖数据库或缓存后端认证系统的基础
CommonMiddleware'django.middleware.common.CommonMiddleware'处理常见任务(如 URL 重写)可配置 APPEND_SLASH自动处理尾部斜杠
CsrfViewMiddleware'django.middleware.csrf.CsrfViewMiddleware'防护 CSRF 攻击表单需 {% csrf_token %}关键安全组件
AuthenticationMiddleware'django.contrib.auth.middleware.AuthenticationMiddleware'将用户附加到 requestrequest.user 可用必须在 SessionMiddleware 之后

8.3 自定义中间件编写

方法名称语法用途代码示例注意事项
函数式中间件def simple_middleware(get_response): ...旧式函数中间件def middleware(request): ...现推荐类形式
类中间件class SimpleMiddleware:新式类中间件必须实现 __init____call__更结构化
process_viewdef process_view(self, request, view_func, view_args, view_kwargs):在调用视图前执行可返回 None 或 HttpResponse可用于权限检查
process_exceptiondef process_exception(self, request, exception):视图抛出异常时调用可返回 HttpResponse 拦截异常用于自定义错误页面
process_template_responsedef process_template_response(self, request, response):处理 TemplateResponse 时调用可修改 response.template_name用于动态模板选择

第九章:RESTful API 开发(可选:结合 Django REST Framework)

注:以下基于 Django REST Framework (DRF)

9.1 API 设计原则

方法名称语法用途代码示例注意事项
REST 原则使用标准 HTTP 方法设计无状态 API 接口GET: 查询, POST: 创建, PUT: 更新, DELETE: 删除遵循资源导向
状态码200 OK, 201 Created, 400 Bad Request, 404 Not Found正确表达操作结果创建成功返回 201提高 API 可理解性
版本控制/api/v1/resource/避免 API 变更影响客户端可通过 URL、Header 控制推荐 URL 路径版本
JSON 格式使用 JSON 作为数据交换格式统一请求与响应结构DRF 默认使用 JSON易于前后端解析
HATEOAS包含相关资源链接实现超媒体驱动响应中包含 next, previous 链接高级 REST 特性

9.2 使用 DRF Serializers

方法名称语法用途代码示例注意事项
Serializerclass MySerializer(serializers.Serializer):定义序列化规则field = serializers.CharField()手动定义所有字段
ModelSerializerclass MyModelSerializer(serializers.ModelSerializer):基于模型自动生成class Meta: model = Post; fields = '__all__'减少重复代码
createdef create(self, validated_data):处理反序列化创建return MyModel.objects.create(**validated_data)自定义对象创建逻辑
updatedef update(self, instance, validated_data):处理反序列化更新instance.name = validated_data.get('name'); return instance自定义更新逻辑
validatedef validate_<field>(self, value):字段级验证if value < 0: raise serializers.ValidationError("负数无效")类似表单 clean_<field>

9.3 API Views 与 ViewSets

方法名称语法用途代码示例注意事项
APIViewclass PostList(APIView):DRF 基础视图类重写 get, post 等方法完全控制逻辑
GenericAPIViewclass PostList(GenericAPIView):通用 API 视图配合 mixins 使用提供 queryset, serializer_class 等属性
ListCreateAPIViewclass PostList(ListCreateAPIView):列表与创建组合自动处理 GET 和 POST减少代码量
ViewSetclass PostViewSet(viewsets.ModelViewSet):视图集,路由自动映射需配合 routers 使用更简洁的 REST 实现
ModelViewSetclass PostViewSet(viewsets.ModelViewSet):完整 CRUD 操作包含 list, create, retrieve, update, destroy最常用 ViewSet

9.4 认证与权限控制在 API 中的应用

方法名称语法用途代码示例注意事项
BasicAuthentication'rest_framework.authentication.BasicAuthentication'HTTP 基本认证简单但不安全,建议配合 HTTPS用户名密码 Base64 编码
TokenAuthentication'rest_framework.authentication.TokenAuthentication'Token 认证机制每用户生成唯一 Token需安装 drf-authtoken
SessionAuthentication'rest_framework.authentication.SessionAuthentication'基于会话认证适合浏览器客户端与 Django 认证系统集成
IsAuthenticated'rest_framework.permissions.IsAuthenticated'仅允许认证用户访问permission_classes = [IsAuthenticated]常用权限类
IsOwnerOrReadOnly自定义权限类作者可编辑,他人只读继承 BasePermission 实现保护用户数据

第十章:部署与性能优化

10.1 生产环境配置(DEBUG, ALLOWED_HOSTS)

方法名称语法用途代码示例注意事项
DEBUG = FalseDEBUG = False关闭调试模式绝对不可在生产开启开启会暴露敏感信息
ALLOWED_HOSTSALLOWED_HOSTS = ['example.com', 'www.example.com']限制可服务的域名防止 HTTP Host 头攻击必须正确配置
SECRET_KEYSECRET_KEY = '生产专用密钥'加密签名密钥从环境变量读取切勿提交到代码仓库
DATABASES配置生产数据库(如 PostgreSQL)使用稳定数据库推荐 PostgreSQL 或 MySQL避免 SQLite 用于生产
CSRF_TRUSTED_ORIGINSCSRF_TRUSTED_ORIGINS = ['https://example.com']信任的跨域来源配合 HTTPS 使用防止 CSRF 攻击

10.2 静态文件收集(collectstatic)

方法名称语法用途代码示例注意事项
collectstaticpython manage.py collectstatic收集所有静态文件生产部署前执行将分散文件复制到统一目录
STATIC_ROOTSTATIC_ROOT = '/var/www/static/'指定收集目标目录Nginx 将服务此目录必须设置
STATIC_URLSTATIC_URL = '/static/'静态文件 URL 前缀模板中使用 {% static %}与 STATIC_ROOT 区分
WhiteNoise'whitenoise.middleware.WhiteNoiseMiddleware'在 Django 中服务静态文件简化部署,适合小流量可替代 Nginx 静态服务
CDN 集成将 STATIC_URL 指向 CDN 地址加速静态资源加载STATIC_URL = 'https://cdn.example.com/static/'提升全球访问速度

10.3 使用 Gunicorn + Nginx 部署

方法名称语法用途代码示例注意事项
Gunicorngunicorn myproject.wsgi:applicationWSGI HTTP 服务器可设置 worker 数量Django 生产常用服务器
Nginxserver { listen 80; location / { proxy_pass http://127.0.0.1:8000; } }反向代理与静态文件服务处理并发、SSL、缓存作为前端服务器
systemd 服务创建 .service 文件管理 Gunicorn 进程开机自启、崩溃重启生产环境推荐
Supervisor配置 supervisord进程监控工具监控多个 Django 实例比 systemd 更灵活
环境变量export DJANGO_SETTINGS_MODULE=prod_settings配置运行环境使用 python-decouple 或 django-environ避免硬编码配置

10.4 日志配置与错误监控

方法名称语法用途代码示例注意事项
LOGGING 配置LOGGING = {...} in settings.py配置日志记录器定义 handlers, loggers, formatters生产环境必须启用
logging.debug/info/errorlogger.info('Message')记录不同级别日志import logging; logger = logging.getLogger(__name__)调试、信息、错误分类
Sentry集成 Sentry SDK错误跟踪与报警实时监控异常推荐用于生产环境
日志轮转TimedRotatingFileHandler按时间分割日志文件避免单个文件过大易于管理和归档
500 错误页面500.html 模板自定义服务器错误页面改善用户体验需 DEBUG=False 时生效