当我们使用 Django 时,它通常会根据请求接收到的HTTP头文件(Headers),响应一个HttpResponse对象。但是,我们可能希望在web应用程序的处理请求和响应过程中添加自己的代码逻辑。这时,中间件的概念就出现了。
什么是中间件
中间件是在请求和响应过程中,在Django框架处理请求和响应对象之间执行的可重用组件。中间件可以拦截请求、修改请求、拦截响应或修改响应。可以添加、修改HTTP头文件,过滤请求和响应等等操作。
Django中间件一般都是一个类,并且至少需要实现以下三个方法的其中一个:
-
process_request(self, request)方法:这个方法在视图函数执行前被调用。返回None或HttpResponse对象。HttpResponse对象会中断请求,否则进入下一个中间件。
-
process_view(self, request, view_func, view_args, view_kwargs)方法:这个方法在视图函数执行前被调用。返回None 或其他HttpResponse对象。
-
process_response(self, request, response)方法:这个方法在视图函数返回HttpResponse对象后被调用。返回HttpResponse对象.
编写自定义中间件
步骤如下:
-
在Django项目根目录创建名为middlewares的文件夹。
-
在该文件夹下创建一个名为middlewares.py的文件,定义自己的中间件类(比如: CheckUserMiddleware)。
```
from django.http import HttpResponseclass CheckUserMiddleware:
def __init__(self, get_response): self.get_response = get_response def __call__(self, request): if request.user.is_authenticated: response = self.get_response(request) return response else: return HttpResponse("您还未登录,无法访问此页面。")
```
-
在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',
'middlewares.CheckUserMiddleware', # 添加自定义中间件
]
如上代码,自定义中间件CheckUserMiddleware 会拦截请求并返回一个HttpResponse对象,如果条件判断符合,则继续执行到视图函数,否则直接返回一个字符串。
示例
示例一:计算请求处理时间
import time
from django.utils.deprecation import MiddlewareMixin
class TimingMiddleware(MiddlewareMixin):
def process_request(self, request):
request.start_time = time.time()
def process_response(self, request, response):
response.add_header("X-Total-Time", time.time() - request.start_time)
return response
在 process_request 方法中,记录请求处理开始时间。在 process_response 中,计算处理请求总共的时间并写入响应头中。
示例二:防止CSRF攻击
from django.middleware.csrf import CsrfViewMiddleware
from django.http import HttpResponseForbidden
class CsrfMiddleware(CsrfViewMiddleware):
def process_view(self, request, callback, callback_args, callback_kwargs):
if request.is_ajax():
return self._reject(request, REASON_NO_CSRF_COOKIE)
return super(CsrfMiddleware, self).process_view(request,
callback, callback_args, callback_kwargs)
def _reject(self, request, reason):
if request.is_ajax():
return HttpResponseForbidden(reason)
return super(CsrfMiddleware, self)._reject(request, reason)
在这个中间件中,我们覆盖了父类中的 process_view 方法,用于判断是否只允许 Ajax 请求,如果是 Ajax 请求(request.is_ajax()),返回一个 HttpResponseForbidden 的响应,否则继续使用父类的默认方法进行CSRF请求验证。
这样就能在响应中添加 CSRF Token,避免POST请求被中间人攻击。
以上是对Django自定义中间件处理的详细讲解,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解django自定义中间件处理 - Python技术站