赞
踩
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.当请求来的时候,先经过中间件的过滤
2.响应走了最后,也要经过中间件
- 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
- #白名单
- 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的这种中间件'''
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。