- 是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出
- 激活:添加到Django配置文件中的MIDDLEWARE_CLASSES元组中
- 每个中间件组件是一个独立的Python类,可以定义下面方法中的一个或多个
- _init _:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件
- process_request(request):执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
- process_view(request, view_func, view_args, view_kwargs):调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
- process_template_response(request, response):在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
- process_response(request, response):所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
- process_exception(request,response,exception):当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象
- 使用中间件,可以干扰整个处理过程,每次请求中都会执行中间件的这个方法
在应用booktest中新增加一个文件myException.py:
#!/usr/bin/env python
# coding=utf-8
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
# 自定义中间件,要继承于MiddlewareMixin
class MyException(MiddlewareMixin):
def process_exception(self,request,exception):
print("MyException里面的 process_exception")
return HttpResponse(exception)
class MD1(MiddlewareMixin):
def process_request(self, request):
print("MD1里面的 process_request")
class MD2(MiddlewareMixin):
def process_request(self, request):
print("MD2里面的 process_request")
settings.py中:
MIDDLEWARE = [
'booktest.myException.MyException', # 新增
'booktest.myException.MD2',# 新增,顺序会影响输出的结果
'booktest.myException.MD1',# 新增,顺序会影响输出的结果
'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',
]
views.py中:
from django.http import HttpResponse
# 中间件练习
def myEx(request):
return HttpResponse(int('hello')) # 正常来说这里肯定报错
urls.py中:
from django.urls import path
urlpatterns = [
path('myEx/',views.myEx),
]
启动服务输入:http://127.0.0.1:8000/myEx/
控制台输出(MD2和MD1输出的顺序和设置settings.py中的顺序一致):
版权声明:本文为z564359805原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。