简介Django中内置的一些中间件


Posted in Python onJuly 24, 2015

认证支持中间件

中间件类: django.contrib.auth.middleware.AuthenticationMiddleware . django.contrib.auth.middleware.AuthenticationMiddleware .

这个中间件激活认证支持功能. 它在每个传入的 HttpRequest 对象中添加代表当前登录用户的 request.user 属性。 It adds the request.user attribute, representing the currently logged-in user, to every incoming HttpRequest object.

通用中间件

Middleware class: django.middleware.common.CommonMiddleware .

这个中间件为完美主义者提供了一些便利:

    禁止 ``DISALLOWED_USER_AGENTS`` 列表中所设置的user agent访问 :一旦提供,这一列表应当由已编译的正则表达式对象组成,这些对象用于匹配传入的request请求头中的user-agent域。 下面这个例子来自某个配置文件片段:

import re

DISALLOWED_USER_AGENTS = (
  re.compile(r'^OmniExplorer_Bot'),
  re.compile(r'^Googlebot')
)
  •     请注意 import re ,因为 DISALLOWED_USER_AGENTS 要求其值为已编译的正则表达式(也就是 re.compile() 的返回值)。
  •     依据 ``APPEND_SLASH`` 和 ``PREPEND_WWW`` 的设置执行URL重写 :如果 APPEND_SLASH 为 True , 那些尾部没有斜杠的URL将被重定向到添加了斜杠的相应URL,除非path的最末组成部分包含点号。 因此, foo.com/bar 会被重定向到 foo.com/bar/ , 但是 foo.com/bar/file.txt 将以不变形式通过。
  •     如果 PREPEND_WWW 为 True , 那些缺少先导www.的URLs将会被重定向到含有先导www.的相应URL上。 will be redirected to the same URL with a leading www..
  •     这两个选项都是为了规范化URL。 其后的哲学是每个URL都应且只应当存在于一处。 技术上来说,URL example.com/bar 与 example.com/bar/ 及 www.example.com/bar/ 都互不相同。
  •     依据 ``USE_ETAGS`` 的设置处理Etag : ETags 是HTTP级别上按条件缓存页面的优化机制。 如果 USE_ETAGS 为 True ,Django针对每个请求以MD5算法处理页面内容,从而得到Etag, 在此基础上,Django将在适当情形下处理并返回 Not Modified 回应(译注:
  •     请注意,还有一个条件化的 GET 中间件, 处理Etags并干得更多,下面马上就会提及。

压缩中间件

中间件类 django.middleware.gzip.GZipMiddleware .

这个中间件自动为能处理gzip压缩(包括所有的现代浏览器)的浏览器自动压缩返回]内容。 这将极大地减少Web服务器所耗用的带宽。 代价是压缩页面需要一些额外的处理时间。

相对于带宽,人们一般更青睐于速度,但是如果你的情形正好相反,尽可启用这个中间件。
条件化的GET中间件

Middleware class: django.middleware.http.ConditionalGetMiddleware .

这个中间件对条件化 GET 操作提供支持。 如果response头中包括 Last-Modified 或 ETag 域,并且request头中包含 If-None-Match 或 If-Modified-Since 域,且两者一致,则该response将被response 304(Not modified)取代。 对 ETag 的支持依赖于 USE_ETAGS 配置及事先在response头中设置 ETag 域。稍前所讨论的通用中间件可用于设置response中的 ETag 域。 As discussed above, the ETag header is set by the Common middleware.

此外,它也将删除处理 HEAD request时所生成的response中的任何内容,并在所有request的response头中设置 Date 和 Content-Length 域。
反向代理支持 (X-Forwarded-For中间件)

Middleware class: django.middleware.http.SetRemoteAddrFromForwardedFor .

这是我们在 什么是中间件 这一节中所举的例子。 在 request.META['HTTP_X_FORWARDED_FOR'] 存在的前提下,它根据其值来设置 request.META['REMOTE_ADDR'] 。在站点位于某个反向代理之后的、每个request的 REMOTE_ADDR 都被指向 127.0.0.1 的情形下,这一功能将非常有用。 It sets request.META['REMOTE_ADDR'] based on request.META['HTTP_X_FORWARDED_FOR'] , if the latter is set. This is useful if you're sitting behind a reverse proxy that causes each request's REMOTE_ADDR to be set to 127.0.0.1 .

红色警告!

这个middleware并 不 验证 HTTP_X_FORWARDED_FOR 的合法性。

如果站点并不位于自动设置 HTTP_X_FORWARDED_FOR 的反向代理之后,请不要使用这个中间件。 否则,因为任何人都能够伪造 HTTP_X_FORWARDED_FOR 值,而 REMOTE_ADDR 又是依据 HTTP_X_FORWARDED_FOR 来设置,这就意味着任何人都能够伪造IP地址。

只有当能够绝对信任 HTTP_X_FORWARDED_FOR 值得时候才能够使用这个中间件。
会话支持中间件

Middleware class: django.contrib.sessions.middleware.SessionMiddleware .

这个中间件激活会话支持功能.

Middleware classes: django.middleware.cache.UpdateCacheMiddleware and django.middleware.cache.FetchFromCacheMiddleware .

这些中间件互相配合以缓存每个基于Django的页面。
事务处理中间件

Middleware class: django.middleware.transaction.TransactionMiddleware .

这个中间件将数据库的 COMMIT 或 ROLLBACK 绑定到request/response处理阶段。 如果view函数成功执行,则发出 COMMIT 指令。 如果view函数抛出异常,则发出 ROLLBACK 指令。

这个中间件在栈中的顺序非常重要。 其外层的中间件模块运行在Django缺省的 保存-提交 行为模式下。 而其内层中间件(在栈中的其后位置出现)将置于与view函数一致的事务机制的控制下。

Python 相关文章推荐
python pickle 和 shelve模块的用法
Sep 16 Python
Python中zip()函数用法实例教程
Jul 31 Python
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
在Python程序中实现分布式进程的教程
Apr 28 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
pyenv命令管理多个Python版本
Mar 26 Python
Python使用pymysql小技巧
Jun 04 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
django缓存配置的几种方法详解
Jul 16 Python
TensorFLow 数学运算的示例代码
Apr 21 Python
Python加密技术之RSA加密解密的实现
Apr 08 Python
关于的python五子棋的算法
May 02 Python
Python字符串转换成浮点数函数分享
Jul 24 #Python
详解Python的Django框架中的中间件
Jul 24 #Python
浅谈Python的Django框架中的缓存控制
Jul 24 #Python
详解Django缓存处理中Vary头部的使用
Jul 24 #Python
解读Django框架中的低层次缓存API
Jul 24 #Python
Python的Django框架中模板碎片缓存简介
Jul 24 #Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 #Python
You might like
PHP的FTP学习(二)[转自奥索]
2006/10/09 PHP
PHP获取文件行数的方法
2015/06/10 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
js获取Get值的方法
2016/09/29 Javascript
vue 权限认证token的实现方法
2018/07/17 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
javascript实现留言板功能
2020/02/08 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
python时间整形转标准格式的示例分享
2014/02/14 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
Python中的ctime()方法使用教程
2015/05/22 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
Keras之fit_generator与train_on_batch用法
2020/06/17 Python
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
三年大学自我鉴定
2014/01/16 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
面试必备的求职信
2014/05/25 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书