Django—middleware

一、Django中间件的请求周期

我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下:

也就是说,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。

二、自定义及注册中间件

1. 创建中间件

在project根目录下创建中间件py文件:

 1 class RequestExeute(object):
 2     def process_request(self, request):
 3         print(‘process_request‘)
 4
 5     def process_view(self, request, callback, callback_args, callback_kwargs):
 6         print(‘process_view‘)
 7
 8     def process_exception(self, request, exception):
 9         """
10         当views函数出错时执行
11         :param request:
12         :param exception:
13         :return:
14         """
15         print(‘process_exception‘)
16
17     def process_response(self, request, response):
18         """
19         必须return HttpResponse
20         :param request:
21         :param response:
22         :return:
23         """
24         print(‘process_response‘)
25         return response
26
27     def process_template_response(self, request, response):
28         """
29         视图函数的返回值中,如果有render方法,才被调用
30         :param request:
31         :param response:
32         :return:
33         """
34         print(‘process_template_response‘)
35         return response

md.py

2. 注册中间件

在settings.py文件中,按照欲执行的顺序注册:

ps. 在1.9及之前的版本中,中间件的关键字为:MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (
    ‘zqxt.middleware.BlockedIpMiddleware‘,
    ...其它的中间件
)

三、中间件中方法的执行顺序

1. 正常状况

 1 from django.shortcuts import HttpResponse
 2 from django.utils.deprecation import MiddlewareMixin
 3 class M1(MiddlewareMixin):
 4     def process_request(self, request):
 5         print(‘m1.request‘)
 6         # return HttpResponse(‘request_m1‘)
 7
 8     def process_view(self, request, callback, callback_args, callback_kwargs):
 9         print(‘m1.view‘)
10         # response = callback(request, *callback_args, **callback_kwargs)
11         # return response
12
13     def process_response(self, request, response):
14         print(‘m1.response‘)
15         return response
16
17     def process_exception(self, request, exception):
18         print(‘m1.process_exception‘)
19         return HttpResponse(‘m1.process_exception‘)
20
21     def process_template_response(self, request, response):
22         """
23         视图函数的返回值中,如果有render方法,才被调用
24         :param request:
25         :param response:
26         :return:
27         """
28         print(‘m1.process_template_response‘)
29         return response
30
31
32 class M2(MiddlewareMixin):
33     def process_request(self, request):
34         print(‘m2.request‘)
35
36     def process_view(self, request, callback, callback_args, callback_kwargs):
37         print(‘m2.view‘)
38         # response = callback(request, *callback_args, **callback_kwargs)
39         # return response
40
41     def process_response(self, request, response):
42         print(‘m2.response‘)
43         return response
44
45     def process_exception(self, request, exception):
46         print(‘m2.process_exception‘)
47         return HttpResponse(‘m2.process_exception‘)
48
49     def process_template_response(self, request, response):
50         """
51         视图函数的返回值中,如果有render方法,才被调用
52         :param request:
53         :param response:
54         :return:
55         """
56         print(‘m2.process_template_response‘)
57         return response

process_request和process_view返回None

执行顺序:

  1. m1.request
  2. m2.request
  3. m1.view
  4. m2.view
  5. m2.response
  6. m1.response

2. 在版本1.10及之后

若process_request返回HttpResponse 对象,则从当前中间件的process_response向前返回

 1 from django.shortcuts import HttpResponse
 2 from django.utils.deprecation import MiddlewareMixin
 3 class M1(MiddlewareMixin):
 4     def process_request(self, request):
 5         print(‘m1.request‘)
 6         return HttpResponse(‘request_m1‘)
 7
 8     def process_view(self, request, callback, callback_args, callback_kwargs):
 9         print(‘m1.view‘)
10         # response = callback(request, *callback_args, **callback_kwargs)
11         # return response
12
13     def process_response(self, request, response):
14         print(‘m1.response‘)
15         return response
16
17     def process_exception(self, request, exception):
18         print(‘m1.process_exception‘)
19         return HttpResponse(‘m1.process_exception‘)
20
21     def process_template_response(self, request, response):
22         """
23         视图函数的返回值中,如果有render方法,才被调用
24         :param request:
25         :param response:
26         :return:
27         """
28         print(‘m1.process_template_response‘)
29         return response
30
31
32 class M2(MiddlewareMixin):
33     def process_request(self, request):
34         print(‘m2.request‘)
35
36     def process_view(self, request, callback, callback_args, callback_kwargs):
37         print(‘m2.view‘)
38         # response = callback(request, *callback_args, **callback_kwargs)
39         # return response
40
41     def process_response(self, request, response):
42         print(‘m2.response‘)
43         return response
44
45     def process_exception(self, request, exception):
46         print(‘m2.process_exception‘)
47         return HttpResponse(‘m2.process_exception‘)
48
49     def process_template_response(self, request, response):
50         """
51         视图函数的返回值中,如果有render方法,才被调用
52         :param request:
53         :param response:
54         :return:
55         """
56         print(‘m2.process_template_response‘)
57         return response
58
59
60 # class RequestExeute(object):
61 #     def process_request(self, request):
62 #         print(‘process_request‘)
63 #
64 #     def process_view(self, request, callback, callback_args, callback_kwargs):
65 #         print(‘process_view‘)
66 #
67 #     def process_exception(self, request, exception):
68 #         """
69 #         当views函数出错时执行
70 #         :param request:
71 #         :param exception:
72 #         :return:
73 #         """
74 #         print(‘process_exception‘)
75 #
76 #     def process_response(self, request, response):
77 #         """
78 #         必须return HttpResponse
79 #         :param request:
80 #         :param response:
81 #         :return:
82 #         """
83 #         print(‘process_response‘)
84 #         return response
85 #
86 #     def process_template_response(self, request, response):
87 #         """
88 #         视图函数的返回值中,如果有render方法,才被调用
89 #         :param request:
90 #         :param response:
91 #         :return:
92 #         """
93 #         print(‘process_template_response‘)
94 #         return response

M1的process_request返回HttpResponse

执行顺序:

  1. m1.request
  2. m1.response

process_view与process_request类似:

 1 from django.shortcuts import HttpResponse
 2 from django.utils.deprecation import MiddlewareMixin
 3 class M1(MiddlewareMixin):
 4     def process_request(self, request):
 5         print(‘m1.request‘)
 6         # return HttpResponse(‘request_m1‘)
 7
 8     def process_view(self, request, callback, callback_args, callback_kwargs):
 9         print(‘m1.view‘)
10         response = callback(request, *callback_args, **callback_kwargs)
11         return response
12
13     def process_response(self, request, response):
14         print(‘m1.response‘)
15         return response
16
17     def process_exception(self, request, exception):
18         print(‘m1.process_exception‘)
19         return HttpResponse(‘m1.process_exception‘)
20
21     def process_template_response(self, request, response):
22         """
23         视图函数的返回值中,如果有render方法,才被调用
24         :param request:
25         :param response:
26         :return:
27         """
28         print(‘m1.process_template_response‘)
29         return response
30
31
32 class M2(MiddlewareMixin):
33     def process_request(self, request):
34         print(‘m2.request‘)
35
36     def process_view(self, request, callback, callback_args, callback_kwargs):
37         print(‘m2.view‘)
38         # response = callback(request, *callback_args, **callback_kwargs)
39         # return response
40
41     def process_response(self, request, response):
42         print(‘m2.response‘)
43         return response
44
45     def process_exception(self, request, exception):
46         print(‘m2.process_exception‘)
47         return HttpResponse(‘m2.process_exception‘)
48
49     def process_template_response(self, request, response):
50         """
51         视图函数的返回值中,如果有render方法,才被调用
52         :param request:
53         :param response:
54         :return:
55         """
56         print(‘m2.process_template_response‘)
57         return response

m1的process_view返回HttpResponse

执行顺序:

  1. m1.request
  2. m2.request
  3. m1.view
  4. m2.response
  5. m1.response

3. 在版本1.10之前

若process_request返回HttpResponse 对象,则当前中间件之后的process_request都不会执行,而从最后一个中间件的process_response向前返回

参考资料:

1. Python之路【第十六篇】:Django【基础篇】

2. http://code.ziqiangxuetang.com/django/django-middleware.html

时间: 2024-10-09 21:07:08

Django—middleware的相关文章

Django MiddleWare初识

一.Django 中间件介绍 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的功能. 简而言之中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法. Django的中间件在settings.py中配置,MIDDLEWARE配置项是一个列表,列表中是一个个字符串,这

django middleware介绍

Middleware Middleware是一个镶嵌到django的request/response处理机制中的一个hooks框架.它是一个修改django全局输入输出的一个底层插件系统. 每个中间件组件负责一些特定的功能,比如说 Django包含一个 AuthenticationMiddleware的中间间,使用sessions将用户和请求联系在一起( that associates users with requests using sessions.). 这篇文章解释了中间件如何工作,如果

Django分析之Middleware中间件

写了几周的脚本,今天终于开始接触web框架了~学习Python的web框架,那么Django就几乎是必修课了,这次的工作是先打打下手,主要的任务是在setting中添加版本号,在渲染静态css,js的路径时附带版本号,例如“example.v1124.css”,然后再在request请求中祛除掉版本号.为什么要这么做呢?因为这样做的话在前端输出静态文件的路径就会加上就会加上版本号,这样当开发出新的静态文件的时候,客户端就会强制刷新本地的缓存,为了达到这个目的就要首先要在settings文件中配置

django之中间件middleware

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件,如下图. 与mange.py在同一目录下的文件夹 wupeiqi/middleware下的auth.py文件中的Authentication类 中间件中可以定义四个方法,分别是: process_r

Django 2.0 Middleware的写法

网上很多写法,都是传统的写法, process_request和process_response方法,还可以用,但process_view的执行流程已经不行了. 看了官方文档,推荐的写法,也是用__call__方法来作实现了. 我试了新老方法,从输出,可以看出效果了. 中间件处理的顺序还是request从上到下,response从下回到上的. from django.utils.deprecation import MiddlewareMixin from django.shortcuts im

Django组件之Middleware

一.中间件 在django的settings.py文件下,有一个变量为MIDDLEWARE,里面放的就是中间件. MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.Csrf

Django中间件MiddleWare

一.什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子. 中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法. 我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下图的MIDDLEWARE配置项. MIDDLEWARE配置项是一个列表,列表中是一个个字符串,这些字符串其实是一个个类,也就是一个个中间件. MIDD

Django 学习之中间件Middleware

一.中间件介绍 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到性能. Django的中间件官方的定义: Middleware is a framework of hooks into Django’s request/response processing. <br>It’s a light, low-level “plugin” system for g

django之(中间件)middleware

中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件(内置) 详细:https://docs.djangoproject.com/en/2.2/ref/middleware/#security-middleware 1 MIDDLEWARE =