关于Django中间件自己的一点理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Django中间件自己的一点理解相关的知识,希望对你有一定的参考价值。

Django中间件我觉得是一个非常重要的东西,所以把自己的一些理解分享出来,哪里有不对的还希望大家可以帮助我修改。

 

因为是自己写的代码,所以就把代码粘过来了,里边每一部分都会有自己的理解和注释,见谅!

 

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect,HttpResponse


#对于有些Django没有MiddleMixin类,就在上边自己写一个,但是这时上边的类引用就不要再引了
# class MiddlewareMixin(object):
# def __init__(self, get_response=None):
# self.get_response = get_response
# super(MiddlewareMixin, self).__init__()
#
# def __call__(self, request):
# response = None
# if hasattr(self, ‘process_request‘):
# response = self.process_request(request)
# if not response:
# response = self.get_response(request)
# if hasattr(self, ‘process_response‘):
# response = self.process_response(request, response)
# return response

#有的Django版本不支持上边的MiddleMixin类,这时你需要自己在上边写一个MiddleMixin类
#定义完自己的中间件加到SETTINGS文件里就可以用了。
class M1(MiddlewareMixin):
def process_request(self,request):
# if request.path_info==‘login‘:
# return None
# elif request.session.get(‘user‘):
# return redirect(‘login‘)
print(‘M1_process_request‘,request)

def process_response(self,request,response):
print(‘M1_request_response‘)
return response
#关于中间件的process_view函数,其实就是帮助路由匹配系统匹配视图函数的中间件,所以在执行完process_request函数以后,会执行
#这里的process_view来匹配视图函数,匹配到以后再去执行视图函数的函数体(注意这里的匹配到并不是匹配到就结束,而是全部都要匹
# 配一遍),所以process_view的执行结果会在视图函数之前,之后再去执行exception函数(如果匹配到异常的话,注意这里的异常只捕
#捉一次),最后再去执行process_response函数

#对于在process_view函数中直接返回结果的情况,这时不再执行接下来的process_view函数,也不再执行视图函数,而是直接从最底端
# 开始执行倒序的process_response函数,这时可以说process_view函数替代了原来的视图函数。
def process_view(self, request, callback, callback_args, callback_kwargs):
print(‘M1.process_view‘)

def process_exception(self,request,response):
print(‘M1.process_exception‘)
return HttpResponse(‘Internal_Error(M1),This is PROCESS_EXCEPTION_HANDLING_FUNCTION‘)

class M2(MiddlewareMixin):
def process_request(self,request):
print(‘M2_process_request‘)

def process_response(self,request,response):
print(‘M2_process_response‘)
return response

def process_view(self, request, callback, callback_args, callback_kwargs):
print(‘M2.process_view‘)

def process_exception(self,request,response):
print(‘M2.process_exception‘)
return HttpResponse(‘Internal_Error(M2),This is PROCESS_EXCEPTION_HANDLING_FUNCTION‘)

#中间件流程总结:
#①.在没有process_view或者process_exception时,浏览器的访问请求通过与Django独立的wsgi模块建立socket链接,在这之后通过Django
#设置的中间件(本身是类,并且可以调用类下定义的方法),顺序是按照配置文件里的中间件中的列表顺序执行中间件的process_request部分,
#遇到不是return None的process_request就会中断,然后从当前终止的位置倒序执行process_response

#②.如果中间件定义了process_view,这时就会顺序执行process_request,执行结束,再从头开始执行process_view以及request_response
#的中间件方法.

#具体显示效果如下:
# M1_process_request <WSGIRequest: GET ‘/favicon.ico‘>
# M2_process_request
# Not Found: /favicon.ico
# [18/Sep/2017 18:32:58] "GET /favicon.ico HTTP/1.1" 404 2061
# M2_process_response
# M1_request_response
# [18/Sep/2017 18:32:59] "GET / HTTP/1.1" 200 62
# M1_process_request <WSGIRequest: GET ‘/‘>
# M2_process_request
# M1.process_view
# M2.process_view
# This is Index View_Function
# M2.process_exception
# M2_process_response
# M1_request_response

#③对于process_response,一定要有返回值,不然访问页面时,后端会报错。
#同时,中间件的process_request处理完请求,视图函数也处理完请求返回值时,倒序通过process_response的return返回值,期间我们
#可以通过process_response处理视图函数返回的值,从而达到修改视图函数返回结果的效果。

以上是关于关于Django中间件自己的一点理解的主要内容,如果未能解决你的问题,请参考以下文章

关于编译原理的一点看法

关于NorFlash的一点总结

关于我对VXLAN的一点理解

关于面向对象的一点牢骚

关于防抖和节流的一点理解

关于服务治理的一点理解