二、 中间件
a) 什么是中间件:中间件是一个类,影响全局。可以改变请求和响应。
b) 自定义中间件:
i. 创建中间件
- 自定义一个类 继承MiddlewareMixin
- 注册 :settings.py 中 MIDDLEWARE 列表中进行注册。
- 5个可以覆写的方法(根据需求来覆写即可)
c) process_request 方法
i. 执行时机:在 视图函数执行之前调用。 并且 request 对象和视图函数中的request对象是同一个。
ii. 返回值: - 如果返回None(也就是没有返回值)则请求放行,执行下一个中间件的process_request 方法。如果每一个中间件都放行,则执行视图函数。
- 如果返回HttpResonse 对象,则拦截不执行后面的中间件的process_request方法和视图函数。则将HttpResponse对象直接返回给浏览器。
d) process_response方法
i. 执行时机:在视图函数执行之后调用,并且必须返回HttpResponse对象。
ii. 返回值:必须返回HttpResponse对象。
e) process_view 方法。
i. 执行时机:在process_request 之后, 视图函数执行之前执行。 - 参数:将视图函数对象,视图函数中的参数,都传递给process_view 方法了。
ii. 返回值: - 返回None :则继续执行后面中间的process_view方法。如果都放行则执行视图函数。
- 返回HttpResponse对象:执行最后的中间件的process_response方法。
然后倒序执行其他中间件的process_response方法。
f) process_exception 方法
i. 执行时机:当视图函数有异常的时候,执行此方法。否则不执行。
ii. 返回值: - 返回None : 将异常抛给下一个中间件的process_exception,如果都不处理则抛给浏览器。
- 返回HttpResponse 对象:将对象返回给浏览器。
g) 4个方法执行顺序
i. Process_request --> process_view --> 视图函数(无异常)–>process_response
h) 使用中间件控制用户访问权限:
i. 思路: - 首先获取url 路径部分。
- 然后将url路径部分和白名单中的路径进行比较,如果url路径在白名单中,放行。如果不在,判断是否携带session或者cookie ,如果携带则放行,否则拦截。
例:
class MD1(MiddlewareMixin):
def process_request(self,request):
print('MD1...request...') #1
def process_response(self, request, response):
print('MD1...resonse...') #7
print('MD1:' + str(id(response))) #8 #打印响应对象
return response
class MD2(MiddlewareMixin):
def process_request(self,request):
print('MD2...request...') #2
def process_response(self, request, response):
print('MD2...resonse...') #5
print('MD2:' + str(id(response))) #6 #打印响应对象
return response
def index(request):
print('视图函数...index...') #3
print('视图函数:' + str(id(request))) #4
return render(request, 'index.html')
返回、
MD1...request
MD2...request
视图函数...index...
视图函数:79237864
MD2...resonse...
MD2:79237864
MD1...resonse...
MD1:79237864