本文和大家分享的主要是django中middleware相关内容,一起来看看吧,希望对大家学习django有所帮助。
一、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
执行顺序:
m1.request
m2.request
m1.view
m2.view
m2.response
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
执行顺序:
m1.request
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
执行顺序:
m1.request
m2.request
m1.view
m2.response
m1.response
3. 在版本1.10之前
若process_request返回HttpResponse 对象,则当前中间件之后的process_request都不会执行,而从最后一个中间件的process_response向前返回
来源:博客园