Django 中间件

中间件。

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

准备工作:

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

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

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

中间件的运行顺序:

创建M1,M2两个中间件。

在settings里注册顺序:

  'my_middle.M1',

  'my_middle.M2',

 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')

运行结果:

  m1的process_request

  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。并将返回值返回给浏览器。

 

posted @ 2019-08-17 16:03  heart丶real  阅读(165)  评论(0编辑  收藏  举报