Python Web 框架 Django 高级应用
学习目标与重点
学习目标:掌握 Python Web 框架 Django 的高级技巧,包括中间件、信号、缓存、表单验证、权限管理等;通过实战案例实现高级 Web 应用。
学习重点:中间件、信号、缓存、表单验证、权限管理、Django 高级功能、Web 应用实战。
Django 高级功能概述
什么是 Django 高级功能
Django 高级功能是指在 Django 框架基础上提供的高级特性,包括中间件、信号、缓存、表单验证、权限管理等。这些功能可以帮助开发者更高效地开发复杂的 Web 应用程序。
高级功能的应用场景
- 中间件:处理 HTTP 请求和响应,如身份验证、日志记录等。
- 信号:实现应用程序各个组件之间的通信。
- 缓存:提高应用程序的性能,减少数据库查询。
- 表单验证:验证用户输入的数据。
- 权限管理:控制用户对资源的访问权限。
中间件
什么是中间件
中间件是 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})
实战案例:博客系统
需求分析
开发一个博客系统,支持以下功能:
- 文章的 CRUD 操作。
- 文章分类管理。
- 评论管理。
- 权限管理。
代码实现
数据模型
# 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")),
]
实施过程
- 安装 Django 和 Django REST framework。
- 创建项目和应用。
- 定义数据模型。
- 编写序列化器。
- 编写视图函数。
- 配置路由。
- 运行应用。
最终效果
通过博客系统,我们可以实现以下功能:
- 文章的 CRUD 操作。
- 文章分类管理。
- 评论管理。
- 权限管理。
总结
本文详细介绍了 Python Web 框架 Django 的高级技巧,包括中间件、信号、缓存、表单验证、权限管理等;学习了 Django 的高级功能;通过实战案例实现了博客系统。


