Django 6中文教程

9.3 中间件实战场景

Django6中间件实战教程:日志记录、权限校验与CORS配置

Django 6中文教程

本教程为初学者详细讲解Django6中中间件的实战应用,包括创建日志记录中间件来跟踪请求信息,实现权限校验中间件以控制接口访问,以及配置跨域请求处理中间件解决CORS问题。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Django6中间件实战教程:日志记录、权限校验与CORS配置

引言

在Django Web框架中,中间件是一个强大的工具,允许我们在请求和响应之间插入处理逻辑。中间件可以用于各种场景,如日志记录、权限校验和跨域请求处理。本教程将详细讲解这三种实战场景,通过代码示例帮助你快速上手,并加深对Django中间件机制的理解。适合所有级别的开发者,尤其是初学者。

1. 日志记录中间件

目的

日志记录中间件用于监控和调试Web应用,它能自动记录每个HTTP请求的路径、耗时和状态码。这有助于分析性能问题和用户行为。

实现步骤

  1. 创建中间件类:在Django应用目录中新建一个文件,例如 middleware.py
  2. 定义类:继承自中间件基类,并重写 __init____call__ 方法。
  3. 计时和记录:在 __call__ 方法中记录请求开始时间,处理请求后计算耗时,并记录相关信息。
  4. 添加到设置:将中间件类路径添加到 settings.pyMIDDLEWARE 列表中。

代码示例

middleware.py 中:

import time
import logging

logger = logging.getLogger(__name__)

class LoggingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 记录请求开始时间
        start_time = time.time()

        # 处理请求
        response = self.get_response(request)

        # 计算耗时
        duration = time.time() - start_time
        path = request.path
        status_code = response.status_code

        # 记录日志
        logger.info(f"请求路径: {path}, 耗时: {duration:.2f}秒, 状态码: {status_code}")

        return response

settings.py 中配置:

MIDDLEWARE = [
    # 其他中间件...
    'your_app.middleware.LoggingMiddleware',  # 替换为你的应用名
    # 其他中间件...
]

注意事项

  • 确保日志配置正确,例如在 settings.py 中设置 LOGGING 以输出到文件或控制台。
  • 在生产环境中,可能需要调整日志级别或添加更多细节。

2. 权限校验中间件

目的

权限校验中间件用于控制接口访问,确保只有授权用户可以访问特定端点。常用于API保护或管理界面。

实现步骤

  1. 创建中间件类:在 middleware.py 中添加新类。
  2. 检查权限:在 __call__ 方法中验证用户认证状态或角色。
  3. 处理未授权:如果权限不足,返回HTTP 403 Forbidden响应。
  4. 添加到设置:与日志记录中间件类似,添加到 MIDDLEWARE 列表。

代码示例

from django.http import HttpResponseForbidden

class PermissionMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 检查权限
        if not self.has_permission(request):
            return HttpResponseForbidden("无权限访问此接口")

        response = self.get_response(request)
        return response

    def has_permission(self, request):
        # 示例逻辑:检查用户是否登录
        if not request.user.is_authenticated:
            return False
        # 进一步检查,例如只允许管理员访问 /admin/ 路径
        if request.path.startswith('/admin/') and not request.user.is_staff:
            return False
        # 可以根据需要添加更多规则
        return True

配置到 settings.py

MIDDLEWARE = [
    # 其他中间件...
    'your_app.middleware.PermissionMiddleware',
    # 其他中间件...
]

进阶提示

  • 可以集成Django的权限系统,使用 request.user.has_perm() 方法。
  • 对于复杂场景,考虑使用基于角色的访问控制(RBAC)或第三方包如 django-guardian

3. 跨域请求处理中间件(CORS 配置)

目的

跨域请求处理中间件允许从不同域名(或端口)访问你的API,解决浏览器同源策略限制。常用于前后端分离项目。

推荐使用第三方包:django-cors-headers

Django社区推荐使用 django-cors-headers 包,因为它提供了完整且安全的CORS解决方案。

安装和配置

  1. 安装包
    pip install django-cors-headers
    
  2. 添加到设置:在 settings.py 中:
    INSTALLED_APPS = [
        # 其他应用...
        'corsheaders',
        # 其他应用...
    ]
    
    MIDDLEWARE = [
        # CorsMiddleware 应该放在最前面
        'corsheaders.middleware.CorsMiddleware',
        # 其他中间件...
    ]
    
  3. 配置CORS设置
    # 开发环境下允许所有域名(慎用于生产)
    CORS_ALLOW_ALL_ORIGINS = True
    
    # 或指定允许的域名
    CORS_ALLOWED_ORIGINS = [
        "http://localhost:3000",
        "https://example.com",
    ]
    

自定义中间件示例(不推荐用于生产)

如果你需要简单自定义,可以创建自己的中间件,但注意安全风险。

class CustomCorsMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        # 添加CORS头
        response["Access-Control-Allow-Origin"] = "*"  # 允许所有域名
        response["Access-Control-Allow-Methods"] = "GET, POST, PUT, DELETE, OPTIONS"
        response["Access-Control-Allow-Headers"] = "Content-Type, Authorization"
        return response

添加到 MIDDLEWARE,但建议优先使用 django-cors-headers

总结

通过本教程,你学习了Django6中三种中间件的实战应用:

  • 日志记录中间件:帮助你监控请求性能,便于调试和优化。
  • 权限校验中间件:增强应用安全性,控制接口访问权限。
  • 跨域请求处理中间件:支持前后端分离开发,解决CORS问题。

中间件是Django的核心特性之一,掌握它们能让你更灵活地构建Web应用。建议从简单示例开始,逐步根据项目需求调整和扩展。实践这些代码,并结合Django官方文档深入学习,以提升你的开发技能。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包