Django 中间件

中间件。

  详细介绍看:https://www.cnblogs.com/liwenzhou/p/8761803.htmlhtml

准备工做:

  1:建立一个.py文件。如:my_middle.pydjango

  2:在建立的py文件里面写自定义的中间件。如:M1,M2浏览器

  3::在setting.py里的MIDDLEWARE里加上自定的中间件。如:‘my_middle.M1’,‘my_middle.M2’,函数

中间件的运行顺序:

建立M1,M2两个中间件。url

在settings里注册顺序:spa

  'my_middle.M1',.net

  'my_middle.M2',3d

 1 from django.utils.deprecation import MiddlewareMixin  2 
 3 class M1(MiddlewareMixin):  4     def process_request(self,request):  5         print('m1的process_request')  6     def process_response(self,request,response):  7         print('m1的process_response')  8         return response  9     def process_view(self,request,callback,callback_arg,callback_kwargs): 10         print(callback) 11         print('m1的process_view') 12 class M2(MiddlewareMixin): 13     def process_request(self,request): 14         print('m2的process_request') 15     def process_response(self,request,response): 16         print('m2的process_response') 17         return response 18     def process_view(self,request,callback,callback_arg,callback_kwargs): 19         print(callback) 20         print('m2的process_view')

运行结果:code

  m1的process_requesthtm

  m2的process_request
  <function middle_test at 0x0000000003F86620>
  m1的process_view
  <function middle_test at 0x0000000003F86620>
  m2的process_view
  视图函数
  m2的process_response
  m1的process_response

其过程如图所示:

    

说明:

  process_request的返回值有两个:None和HttpResponse。若是返回值是None则按原来的顺序进行执行,入若是是HttpResponse则不会执行后面的中间件中的process_request,和process_view。直接从该中间件的process_response执行。并将返回值返回给用户。

  process_response只能返回HttpResponse对象,这里返回的是response。

  process_view有4个参数

      request:请求相关的内容。

      callback:是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称做为字符串。)

      callback_args是将传递给视图的位置参数的列表.

      callback_kwargs是将传递给视图的关键字参数的字典。 callback_args和callback_kwargs都不包含第一个视图参数(request)。

      ps:后面三个参数callback这个名字是能够改变的。

  process_view有2个返回值None和HttpResponse。当返回值是None时,按原来的顺序执行不作改变。入若是是HttpResponse,则不会执行后面的中间件的process_view,直接执行process_response(不是从当前中间件的process_response执行,是从第一个执行)。

  process_exception(self,request,exception):是在执行试图函数以后process_response以前执行。在视图函数没有异常时不执行。视图函数有异常时才执行。执行的顺序是按照注册的顺序的倒序执行。有2个返回值None和HttpResponse。当返回值是None时,按原来的顺序执行不作改变。入若是是HttpResponse,如:

return HttpResponse(str(exception)),不会执行下面的process_exception,直接执行process_response。并将返回值返回给浏览器。

 

相关文章
相关标签/搜索