中间件
中间件
中间件是django 的门户,所有的请求和响应都要通过中间件
django中自带的有7个中间件,
django中间件的介绍
在django settings里面的MIDDLEWARE_CLASSES
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',
]
我们简单的看一下里面几个的源码
class SessionMiddleware(MiddlewareMixin):
def process_request(self, request):
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
request.session = self.SessionStore(session_key)
def process_response(self, request, response):
return response
class CsrfViewMiddleware(MiddlewareMixin):
def process_request(self, request):
csrf_token = self._get_token(request)
if csrf_token is not None:
# Use same token next time.
request.META['CSRF_COOKIE'] = csrf_token
def process_view(self, request, callback, callback_args, callback_kwargs):
return self._accept(request)
def process_response(self, request, response):
return response
我们从这两个中间件的源码可以看出,他们都有process_request
和 process_response
两个方法,所以这个是我们需要掌握的方法,另外的三个是需要了解的process_view
,process_template_response
,process_exception
自定义中间件
在一个项目或者应用名下常见一个任意的文件夹,在文件夹内常见任意名称的py文件,在该py文件内需要书写类(类要结成MiddlewareMixin)在这个里面书写自定义的五个方法,然后将类的路径已字符串的形式注册到配置文件中才能生效
首先我们在项目app01里面创建一个mymiddel文件夹,在里面创建py文件,然后自定义我们的中间件,最后注册到settings里面
from django.utils.deprecation import MiddlewareMixin
class MyMiddelware1(MiddlewareMixin):
def process_request(self, request):
print('这是我的第1个中间间里面的process_reuqest')
def process_response(self, request, response):
print('这是我的第1个中间件里面的process_response方法')
return response
def process_view(self,request,*args,**kwargs):
print(args,kwargs)
print('这是我的第1个中间件里面的process_view方法')
def prcoess_template_response(self,request,response):
print('这是我的第1个中间件里面的prcoess_template_response方法')
return response
def process_exception(self,request,exception):
print('这是我的第1个中间件里面的process_exception方法')
print(exception)
class MyMiddelware2(MiddlewareMixin):
def process_request(self, request):
print('这是我的第2个中间间里面的process_request')
def process_response(self, request, response):
print('这是我的第2个中间件里面的process_response方法')
return response
def process_view(self, request, *args, **kwargs):
print(args, kwargs)
print('这是我的第2个中间件里面的process_view方法')
def prcoess_template_response(self, request, response):
print('这是我的第2个中间件里面的prcoess_template_response方法')
return response
def process_exception(self, request, exception):
print('这是我的第2个中间件里面的process_exception方法')
print(exception)
view视图
def index(request):
print('index视图函数')
return HttpResponse('这是index的内容')
答案:
这是我的第1个中间间里面的process_reuqest
这是我的第2个中间间里面的process_request
(<function index at 0x000001571ED49AE8>, (), {}) {}
这是我的第1个中间件里面的process_view方法
(<function index at 0x000001571ED49AE8>, (), {}) {}
这是我的第2个中间件里面的process_view方法
index视图函数
这是我的第2个中间件里面的process_response方法
这是我的第1个中间件里面的process_response方法
process_request
-
从这里我们可以看出我们在输入url 请求的时候,都需要经过每一个中间件里面的process_request方法,他们的执行顺序是按照注册中间件的自上而下执行
-
没有中间件里面定义该方法,直接跳过执行下一个
-
如果在该方法中返回一个HttpResponse对象,请求将不再继续执行,原路返回,证明校验失败,不允许访问(截胡)
-
process_request方法是用来做全局相关功能的
process_response
- 响应走的时候需要每一个中间件里面的方法process_response ,里面的参数·
response
就是django后端返回给浏览器的内容,默认返回的是形参response,也可以返回自己的 - 没有中间件里面定义该方法,直接跳过执行下一个
- 而且它返回的方式像FIFO的形式,先进先出
process_view(了解)
(<function index at 0x000001571ED49AE8>, (), {}) {}
- 路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该放法
- 顺序是按照配置文件中注册的中间件从上往下的顺序依次执行
prcoess_template_response(了解)
- 返回的HttpResponse对象有render属性的时候才会触发
- 顺序是按照配置文件中注册了的中间件从下往上依次经过
process_exception
- 当视图函数中出现异常的情况下触发
- 顺序是按照配置文件中注册了的中间件从下往上依次经过