详解Python的Django框架中的中间件


Posted in Python onJuly 24, 2015

什么是中间件

我们从一个简单的例子开始。

高流量的站点通常需要将Django部署在负载平衡proxy之后。 这种方式将带来一些复杂性,其一就是每个request中的远程IP地址(request.META["REMOTE_IP"])将指向该负载平衡proxy,而不是发起这个request的实际IP。 负载平衡proxy处理这个问题的方法在特殊的 X-Forwarded-For 中设置实际发起请求的IP。

因此,需要一个小小的中间件来确保运行在proxy之后的站点也能够在 request.META["REMOTE_ADDR"] 中得到正确的IP地址:

class SetRemoteAddrFromForwardedFor(object):
  def process_request(self, request):
    try:
      real_ip = request.META['HTTP_X_FORWARDED_FOR']
    except KeyError:
      pass
    else:
      # HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs.
      # Take just the first one.
      real_ip = real_ip.split(",")[0]
      request.META['REMOTE_ADDR'] = real_ip
(Note: Although the HTTP header is called X-Forwarded-For , Django makes it available as request.META['HTTP_X_FORWARDED_FOR'] . With the exception of content-length and content-type , any HTTP headers in the request are converted to request.META keys by converting all characters to uppercase, replacing any hyphens with underscores and adding an HTTP_ prefix to the name.)

一旦安装了该中间件(参见下一节),每个request中的 X-Forwarded-For 值都会被自动插入到 request.META['REMOTE_ADDR'] 中。这样,Django应用就不需要关心自己是否位于负载平衡proxy之后;简单读取 request.META['REMOTE_ADDR'] 的方式在是否有proxy的情形下都将正常工作。

实际上,为针对这个非常常见的情形,Django已将该中间件内置。 它位于 django.middleware.http 中, 下一节将给出这个中间件相关的更多细节。
安装中间件

要启用一个中间件,只需将其添加到配置模块的 MIDDLEWARE_CLASSES 元组中。 在 MIDDLEWARE_CLASSES 中,中间件组件用字符串表示: 指向中间件类名的完整Python路径。 例如,下面是 django-admin.py startproject 创建的缺省 MIDDLEWARE_CLASSES :

MIDDLEWARE_CLASSES = (
  'django.middleware.common.CommonMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
)

Django项目的安装并不强制要求任何中间件,如果你愿意, MIDDLEWARE_CLASSES 可以为空。

这里中间件出现的顺序非常重要。 在request和view的处理阶段,Django按照 MIDDLEWARE_CLASSES 中出现的顺序来应用中间件,而在response和异常处理阶段,Django则按逆序来调用它们。 也就是说,Django将 MIDDLEWARE_CLASSES 视为view函数外层的顺序包装子: 在request阶段按顺序从上到下穿过,而在response则反过来。

Python 相关文章推荐
Java Web开发过程中登陆模块的验证码的实现方式总结
May 25 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
Jul 12 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
Oct 11 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
May 11 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 Python
Python制作表白爱心合集
Jan 22 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
详解Django框架中的视图级缓存
Jul 23 #Python
Django中的CACHE_BACKEND参数和站点级Cache设置
Jul 23 #Python
You might like
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
IE中createElement需要注意的一个问题
2010/07/13 Javascript
JS实现很酷的水波文字特效实例
2015/02/26 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
微信小程序 本地图片按照屏幕尺寸处理
2017/08/04 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python 连连看连接算法
2008/11/22 Python
python获取mp3文件信息的方法
2015/06/15 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
理论讲解python多进程并发编程
2018/02/09 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
学期自我鉴定范文
2013/10/01 职场文书
大学生求职简历的自我评价范文
2013/10/12 职场文书
新员工入职欢迎词
2015/01/23 职场文书
行政主管岗位职责
2015/02/03 职场文书
务工证明怎么写
2015/06/18 职场文书
社会实践心得体会范文
2016/01/14 职场文书