Python Web 框架 Django 高级应用
学习目标与重点
学习目标:掌握 Python Web 框架 Django 的高级技巧,包括中间件、信号、缓存、表单验证、权限管理等;通过实战案例实现高级 Web 应用。
Python Web 框架 Django 的高级功能,涵盖中间件、信号、缓存、表单验证及权限管理的配置与使用。通过博客系统实战案例,演示了模型定义、序列化器编写、视图集配置及路由设置,帮助开发者构建高性能、安全的 Web 应用。

学习目标:掌握 Python Web 框架 Django 的高级技巧,包括中间件、信号、缓存、表单验证、权限管理等;通过实战案例实现高级 Web 应用。
学习重点:中间件、信号、缓存、表单验证、权限管理、Django 高级功能、Web 应用实战。
Django 高级功能是指在 Django 框架基础上提供的高级特性,包括中间件、信号、缓存、表单验证、权限管理等。这些功能可以帮助开发者更高效地开发复杂的 Web 应用程序。
中间件是 Django 框架中的一个组件,用于处理 HTTP 请求和响应。中间件可以在请求到达视图函数之前或响应返回客户端之前执行特定的操作。
# myapp/middleware.py
from django.http import HttpResponse
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print("请求到达视图函数之前")
response = self.get_response(request)
print("响应返回客户端之前")
return response
# myproject/settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'myapp.middleware.SimpleMiddleware',
]
信号是 Django 框架中的一个组件,用于实现应用程序各个组件之间的通信。当某个事件发生时,信号会发送一个通知,其他组件可以监听这个通知并执行相应的操作。
Django 提供了多种内置信号,如:
django.db.models.signals.pre_save:在保存模型之前发送。django.db.models.signals.post_save:在保存模型之后发送。django.db.models.signals.pre_delete:在删除模型之前发送。django.db.models.signals.post_delete:在删除模型之后发送。# myapp/signals.py
import django.dispatch
# 定义信号
my_signal = django.dispatch.Signal()
# myapp/views.py
from myapp.signals import my_signal
from django.http import HttpResponse
def my_view(request):
# 发送信号
my_signal.send(sender=my_view, message="Hello, World!")
return HttpResponse("信号已发送")
# myapp/receivers.py
from django.dispatch import receiver
from myapp.signals import my_signal
@receiver(my_signal)
def my_receiver(sender, **kwargs):
print("收到信号")
print("发送者:", sender)
print("参数:", kwargs)
# myapp/apps.py
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myapp'
def ready(self):
import myapp.receivers
缓存是一种提高应用程序性能的技术,通过存储经常访问的数据,减少数据库查询和计算的时间。Django 提供了多种缓存后端,如 Memcached、Redis 等。
# myproject/settings.py
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
# myapp/views.py
from django.core.cache import cache
from django.http import HttpResponse
def my_view(request):
# 从缓存中获取数据
data = cache.get('my_data')
if data is None:
# 缓存未命中,从数据库中获取数据
data = "Hello, World!"
# 将数据存入缓存,有效期为 60 秒
cache.set('my_data', data, 60)
return HttpResponse(data)
# myapp/forms.py
from django import forms
class MyForm(forms.Form):
name = forms.CharField(label='姓名', max_length=100)
email = forms.EmailField(label='邮箱')
def clean_name(self):
name = self.cleaned_data['name']
if len(name) < 2:
raise forms.ValidationError('姓名长度不能少于 2 个字符')
return name
def clean_email(self):
email = self.cleaned_data['email']
if not email.endswith('@example.com'):
raise forms.ValidationError('邮箱必须以@example.com 结尾')
return email
# myapp/views.py
from myapp.forms import MyForm
from django.shortcuts import render, redirect
def my_view(request):
if request.method == 'POST':
form = MyForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
email = form.cleaned_data['email']
return redirect('success')
else:
form = MyForm()
return render(request, 'myapp/my_form.html', {'form': form})
# myapp/models.py
from django.db import models
from django.contrib.auth.models import Permission
class MyModel(models.Model):
name = models.CharField(max_length=100)
class Meta:
permissions = [
('can_view', 'Can view my model'),
('can_edit', 'Can edit my model'),
('can_delete', 'Can delete my model'),
]
# myapp/admin.py
from django.contrib import admin
from myapp.models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
list_display = ['name']
# myapp/views.py
from myapp.models import MyModel
from django.contrib.auth.decorators import permission_required
from django.shortcuts import render
@permission_required('myapp.can_view')
def my_view(request):
data = MyModel.objects.all()
return render(request, 'myapp/my_view.html', {'data': data})
开发一个博客系统,支持以下功能:
# myapp/models.py
from django.db import models
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.author.username} - {self.article.title}"
# myapp/serializers.py
from rest_framework import serializers
from myapp.models import Category, Article, Comment
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = "__all__"
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = "__all__"
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = "__all__"
# myapp/views.py
from rest_framework import viewsets, permissions
from rest_framework.authentication import TokenAuthentication
from myapp.models import Category, Article, Comment
from myapp.serializers import CategorySerializer, ArticleSerializer, CommentSerializer
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
class CommentViewSet(viewsets.ModelViewSet):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
# myapp/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from myapp.views import CategoryViewSet, ArticleViewSet, CommentViewSet
router = DefaultRouter()
router.register(r"categories", CategoryViewSet)
router.register(r"articles", ArticleViewSet)
router.register(r"comments", CommentViewSet)
urlpatterns = [
path("", include(router.urls)),
]
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("api/", include("myapp.urls")),
]
通过博客系统,我们可以实现以下功能:
本文详细介绍了 Python Web 框架 Django 的高级技巧,包括中间件、信号、缓存、表单验证、权限管理等;学习了 Django 的高级功能;通过实战案例实现了博客系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online