目录
1. Django 中间件简介
在 Django 中,中间件是一个轻量级的、底层的插件系统,它可以处理请求和响应的生命周期。中间件的主要目的是在请求处理过程中拦截和修改请求或响应。Django 中的每个请求都会依次通过中间件进行处理,从而能够实现各种功能,如认证、缓存、会话管理、安全等。
- 请求处理:中间件可以拦截请求并进行一些处理后传递给视图。
- 响应处理:视图处理请求后,生成的响应也可以通过中间件进行修改或附加操作。
Django 的中间件是按顺序应用的,每个中间件类都可以对请求和响应进行处理。
2. Django 中间件的工作原理
Django 中间件的工作原理可以分为两个主要阶段:
- 请求阶段:当一个 HTTP 请求到达 Django 时,它会依次通过在
MIDDLEWARE
配置中的中间件类进行处理。中间件会接收请求对象request
,并对其进行处理,然后将其传递给视图函数。 - 响应阶段:视图处理完成后,返回一个响应对象
response
,它会通过中间件链反向传递给客户端。在这一过程中,中间件类可以修改响应内容或做其他操作。
请求处理顺序:
- 请求从浏览器到达服务器。
- 请求依次通过
MIDDLEWARE
中配置的中间件处理。 - 最后由视图函数处理请求并返回响应。
响应处理顺序:
- 视图返回响应。
- 响应依次通过
MIDDLEWARE
中的中间件进行处理。 - 最终响应返回给客户端。
3. 自定义中间件
3.1 编写简单中间件
Django 中间件通常是一个类,该类实现了 __init__
和 __call__
方法。Django 1.10 及以后版本支持基于类的中间件结构,而早期版本使用基于函数的中间件。
以下是一个基于类的中间件示例:
# 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("Before processing request")
# 调用下一个中间件或者视图处理请求
response = self.get_response(request)
# 响应处理后
print("After processing response")
return response
__init__(self, get_response)
:构造函数接收一个get_response
参数,它代表了下一个中间件或视图的处理函数。__call__(self, request)
:每次请求都会调用这个方法,在这里可以处理请求和响应。
3.2 中间件处理请求和响应
可以在 __call__
方法中访问和修改请求(request
)或响应(response
)。例如:
# myapp/middleware.py
class CustomMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 在请求阶段,修改请求
request.custom_attribute = "Hello, Middleware!"
# 调用下一个中间件或视图
response = self.get_response(request)
# 在响应阶段,修改响应
response['X-Custom-Header'] = 'Custom Value'
return response
在这个例子中,request.custom_attribute
在请求处理前被添加,然后在视图中可以访问该属性。同时,在响应中增加了一个自定义 HTTP 头 X-Custom-Header
。
4. 中间件链
Django 中的中间件是按照在 MIDDLEWARE
配置中的顺序应用的。每个中间件都可以修改请求或响应,最终形成一个中间件链。
- 请求链:请求会按照
MIDDLEWARE
中配置的顺序进入每个中间件。 - 响应链:响应会逆向经过中间件链。
例如:
# settings.py
MIDDLEWARE = [
'myapp.middleware.MiddlewareOne',
'myapp.middleware.MiddlewareTwo',
'django.middleware.common.CommonMiddleware',
]
在请求进入视图之前,它将先经过 MiddlewareOne
,然后是 MiddlewareTwo
,最后是 Django 的 CommonMiddleware
。响应将按相反的顺序处理。
5. 常见的中间件类
Django 提供了许多内置中间件类来处理常见任务。以下是一些常见的中间件类:
django.middleware.security.SecurityMiddleware
:提供跨站点请求伪造(CSRF)、HTTP Strict Transport Security(HSTS)等安全功能。django.contrib.sessions.middleware.SessionMiddleware
:管理用户会话。django.contrib.auth.middleware.AuthenticationMiddleware
:实现用户认证系统,关联当前用户。django.middleware.common.CommonMiddleware
:提供一些常用的功能,如重定向和 URL 规范化。django.middleware.csrf.CsrfViewMiddleware
:处理 CSRF 攻击防护。django.middleware.gzip.GZipMiddleware
:提供 HTTP 响应的压缩功能。django.middleware.locale.LocaleMiddleware
:处理国际化(i18n)相关的中间件。
这些中间件可以通过 MIDDLEWARE
配置启用和配置。
发表回复