Django中间件
Django中间件是Django的门户
- 请求来的时候需要先经过中间件才能达到真正的Django后端
- 响应走的时候最后也要经过中间件才能发送出去
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',
]
# 均为Django中间件
取其中三个查看源码。
from django.contrib.sessions.middleware import SessionMiddleware
from django.contrib.auth.middleware import AuthenticationMiddleware
from django.contrib.messages.middleware import MessageMiddleware
# process_request
# process_response
两者基本所有中间件都具有
Django支持程序员自定义中间件并且暴露给程序员五个可以自定义的方法
1.process_request
2.process_response
3.process_view
4.process_template_response
5.process_exception
自定义中间件
如何自定义中间件?
1. 在项目名或者应用下创建一个任意名称的文件夹
2. 在该文件夹内创建一个任意名称的py文件
3. 在该py文件中需要书写类,这个类必须继承(MiddlewareMixin)
4. 需要将类的路径以字符串的形式注册到settings配置文件中(MIDDLEWARE)
from django.utils.deprecation import MiddlewareMixin
class Mymiddleware1(MiddlewareMixin):
def process_request(self, request):
print('我是第一个process_request方法')
def process_response(self, request,response):
print('我是第一个process_response方法')
return response
class Mymiddleware2(MiddlewareMixin):
def process_request(self, request):
print('我是第二个process_request方法')
def process_response(self, request,response):
print('我是第二个process_response方法')
return response
process_request: 请求来的时候
# process_request
1.请求来的时候需要经过每一个中间件里面的process_request方法,结果的顺序是按照匹配文件中注册的中间件从上往下的顺序一次执行。
2.如果中间件里面没有定义该方法,那么请求将不再继续往后执行
3.如果该方法返回了HttpResponse对象,那么请求将不再继续往后执行而是直接原路返回(可用作检验用户是否为黑名单,校验失败不允许访问等需要验证的地方)
'process_request方法就是用来做全局相关的所有限制功能'
process_response: 响应请求走的时候
1.响应走的时候需要经过每一个中间件里面的process_response方法,该方法有两个额外的参数request,response。
2.该方法必须返回一个HttpResponse对象
2.1默认返回的就是形参request
2.2也可以返回自己的
3.顺序是按照配置文件中注册从下往上的一次经过,如果没有定义,直接跳过执行下一个
如果在第一个process_request方法返回HttpResponse,会怎样?
会直接走同级别的process_request返回。