简介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 相关文章推荐
flask中使用SQLAlchemy进行辅助开发的代码
Feb 10 Python
Python中的闭包详细介绍和实例
Nov 21 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
Python学习pygal绘制线图代码分享
Dec 09 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
Python中实现switch功能实例解析
Jan 11 Python
python实现写数字文件名的递增保存文件方法
Oct 25 Python
Python 互换字典的键值对实例
Feb 12 Python
安装完Python包然后找不到模块的解决步骤
Feb 13 Python
基于python实现查询ip地址来源
Jun 02 Python
python实现简单的名片管理系统
Apr 26 Python
Python实现随机生成迷宫并自动寻路
Jun 13 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
example1.php
2006/10/09 PHP
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
2019/04/29 Python
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
综合办公室个人的自我评价
2013/12/22 职场文书
2014年幼儿园植树节活动方案
2014/03/02 职场文书
党员一句话承诺大全
2014/03/28 职场文书
2014年预备党员群众路线教育实践活动对照检查材料思想汇报
2014/10/02 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书