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',]
1.介绍
1.当请求来的时候,先经过中间件的过滤
2.响应走了最后,也要经过中间件
2.django的中间件给我们暴露了一些方法
class SessionMiddleware(MiddlewareMixin):
def process_request(self,request) #请求过来时,会触发process_request方法,
def process_response(self, request, response): #响应有的时候,会触发process_pesponse方法
还有
process_view----------------》是跟视图函数相关的
process_exception----------------》跟异常相关的
process_template_response----------------》跟模板相关的
# 在一个中间件中,暴露的这几个方法不是每个类都必须有的,而是需要什么就写什么
自定义中间件
from django.utils.deprecation import MiddlewareMixin定义一个类,必须继承MiddlewareMixin,类名要符合命名规范
然后就是重写方法
def process_request(self, request):
def process_response(self, request, response):
process_view----------------》是跟视图函数相关的
process_exception----------------》跟异常相关的
process_template_response----------------》跟模板相关的# 在一个中间件中,暴露的这几个方法不是每个类都必须有的,而是需要什么就写什么
举个列子----在自定义中间件实现认证登录
重新建一个文件夹,建一个py文件
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
class Mylogins(MiddlewareMixin):
def process_request(self, request):
path_a=request.path_info #获取请求url的后缀,/index/
if path_a not in settings.WHITE_LIST: #判断路径是否在这个白名单中
user_obj = request.session.get('user') #在登录后,设置session
if not user_obj: #不存在 就重定向到登陆页面
return redirect('login')
pass
settings.py配置白名单
#白名单
WHITE_LIST = ['/reg/', '/login/', '/get_code/','/home/']
最后一定要在配置文件中,注册你的中间件
中间件问题
# 针对process_reqeust
1. 执行顺序是按照配置文件中注册的顺序,从上往下依次执行
2. 视图函数在中间件的process_reqeust函数之后执行
3. 如果在process_reqeust里面直接返回HttpResponse,之后的中间件一律不在走了,包括视图函数
# # 针对process_response
1. 必须要返回一个HttpResponse
2. 执行顺序:是按照配置文件的注册顺序,从下往上依次执行# 最后一个问题:
研究我在第一个中间件的process_reqeust方法中,直接返回HttpResponse,然后,观察所有中间件的process_response的执行顺序?
# 结论:如果在第一个中间件中得process_reqeust中直接拦截,只走第一个中间件的process_reqeust和第一个中间件的process_response,直接原路返回.# 但是,在flask框架中,如果你在第一个拦截了,后面的类似于是process_response都会走一遍.
'''flask框架中实际上没有真正的中间件,它是需要你看源码自己做成类似于django的这种中间件'''