Django学习之middleware的使用

本文和大家分享的主要是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向前返回

来源:博客园

时间: 2024-10-14 00:55:37

Django学习之middleware的使用的相关文章

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中间件

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

Django学习笔记(四)—— Admin

疯狂的暑假学习之  Django学习笔记(四)-- Admin 参考:<The Django Book> 第6章 Django 可以使用admin自动创建管理界面. 1. 配置 django-admin.py startproject 创建的项目,如果没有注解掉默认的配置,python manage.py syncdb 创建用户后,直接 http://xxxxxx/admin 输入密码即可进入. 如果修改了配置文件,保证将 django.contrib.admin 加入setting.py 中

Python框架之Django学习笔记(十二)

Django站点管理 十一转眼结束,说好的充电没能顺利开展,反而悠闲的看了电视剧以及去影院看了新上映的<心花路放>.<亲爱的>以及<黄金时代>,说好的劳逸结合现在回首看去,如果睡觉吃饭算是的话,那倒是挺多.是啊,十一过去了,也该收收心,开始准备过年了.啊,不对,准备工作.扯淡到此结束,接下来,开始学习Django的站点管理. 管理界面有一问题: 创建它太繁琐. 当你开发对公众的功能时,网页开发是有趣的,但是创建管理界面通常是千篇一律的. 你必须认证用户,显示并管理表格,

Django学习笔记 官网教程纠正 代码

原文: Django学习笔记 官网教程纠正 代码 Django学习笔记 4.模板初学中,照书例django book 出现以下异常 raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE) ImportError: Settings cannot be imported, because environmen

Django 学习笔记(七)数据库基本操作(增查改删)

一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.py 5.同步数据 二.安装IPython方便debug sudo apt-get install ipython3 安装成功后用python manage.py shell 会自动进入Ipython交互解释器中,没有安装Ipython只有前两行代码,只进入到Python shell 中. Python 3.5

Django学习系列之中间件

中间件的定义 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类 django请求生命周期 自定义中间件 process_request(self,request): 请求到达之后之后先执行这个中间件 process_view(self, request, callback, callback_args, callback_kwargs): process_exception(self, requ

Django学习笔记 Day One

Time:2016年01月01日21:38:55 Description: 从今天开始我开始写我的Django学习笔记,因为网络上太多太杂乱的文章,不成系统,还有就是太多的培训机构讲述的东西过于简单,没有深入讲解Django,算是自己的一个小笔记吧,主要参考的是Django1.8的官方文档,地址:www.djangoproject.com,一家之言,大神勿喷! Content: Day One. First exploration of django? 我们在Web开发过程中,常常会遇到编写重复

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写