Django 中间件
封面图
•
2025-10-15
•
Django教程
0
0
0
0
在 Django 中,**中间件(Middleware)** 是一种可以全局处理请求和响应的机制。它允许你在视图函数执行前后做一些通用的操作,比如: - 认证与授权 - 日志记录 - 压缩响应 - 设置语言或时区 - 处理跨域请求(CORS) - 异常处理 --- ## 一、中间件的基本概念 Django 的中间件是按顺序执行的,分为两个阶段: 1. **请求阶段(Request processing)**:在请求到达视图之前执行。 2. **响应阶段(Response processing)**:在视图返回响应之后执行。 每个中间件可以定义以下方法: - `__init__()`:初始化方法(可选) - `process_request(request)`:在视图执行前调用 - `process_view(request, view_func, view_args, view_kwargs)`:在视图函数执行前调用(可选) - `process_template_response(request, response)`:在模板响应返回后调用(可选) - `process_response(request, response)`:在视图返回响应后调用 - `process_exception(request, exception)`:当视图抛出异常时调用(可选) --- ## 二、中间件的使用方式 ### 1. 在 `settings.py` 中配置 ```python 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', ] ``` > 注意:中间件的顺序非常重要,特别是像 `SessionMiddleware` 和 `AuthenticationMiddleware` 这类依赖其他中间件的模块。 --- ## 三、自定义中间件示例 ### 示例:记录请求日志的中间件 ```python # middleware.py import logging logger = logging.getLogger(__name__) class RequestLoggingMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 请求前处理 logger.info(f"Request: {request.method} {request.path}") response = self.get_response(request) # 响应后处理 logger.info(f"Response status: {response.status_code}") return response ``` 然后在 `settings.py` 中添加这个中间件: ```python MIDDLEWARE = [ ... 'your_app.middleware.RequestLoggingMiddleware', ... ] ``` --- ## 四、常用中间件介绍 | 中间件名称 | 功能 | |------------|------| | `CommonMiddleware` | 处理 URL 的一些常见问题(如自动添加/删除斜杠) | | `SessionMiddleware` | 管理会话(session) | | `CsrfViewMiddleware` | 防止 CSRF 攻击 | | `AuthenticationMiddleware` | 管理用户认证状态 | | `MessageMiddleware` | 处理消息框架(messages framework) | | `XFrameOptionsMiddleware` | 防止点击劫持攻击 | --- ## 五、中间件的高级用法 ### 1. 使用装饰器包装中间件 你可以使用 `@csrf_exempt` 或 `@never_cache` 来对某些视图跳过中间件处理。 ### 2. 使用 `process_view` 方法 ```python def process_view(self, request, view_func, view_args, view_kwargs): if not request.user.is_authenticated: return redirect('login') ``` ### 3. 使用 `process_exception` 处理异常 ```python def process_exception(self, request, exception): logger.error(f"Exception occurred: {exception}") return HttpResponse("An error occurred.") ``` --- ## 六、注意事项 - 中间件是全局的,会影响所有请求。 - 某些中间件(如 `SessionMiddleware`)需要放在前面。 - 不要过度使用中间件,避免性能问题。 --- 如果你有具体的场景(比如实现登录验证、日志记录、CORS 支持等),我可以帮你写一个完整的中间件代码示例。欢迎继续提问!
上一篇:
Django 简介
标题录入,一次不能超过6条
返回顶部
留言
留言
评论