详解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 相关文章推荐
python 排列组合之itertools
Mar 20 Python
python字典get()方法用法分析
Apr 17 Python
python实现中文转换url编码的方法
Jun 14 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
Dec 23 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
python utc datetime转换为时间戳的方法
Jan 15 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
Python对wav文件的重采样实例
Feb 25 Python
Python绘图之柱形图绘制详解
Jul 28 Python
Python3如何在服务器打印资产信息
Aug 27 Python
Python实现随机爬山算法
Jan 29 Python
完美处理python与anaconda环境变量的冲突问题
Apr 07 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中的按位与和按位或操作示例
2014/01/27 PHP
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
jQuery的缓存机制浅析
2014/06/07 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
python获取文件扩展名的方法
2015/07/06 Python
深入解析Python编程中JSON模块的使用
2015/10/15 Python
Python处理CSV与List的转换方法
2018/04/19 Python
Flask框架实现给视图函数增加装饰器操作示例
2018/07/16 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Django web框架使用url path name详解
2019/04/29 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
Python如何将函数值赋给变量
2020/04/28 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
C++面试题目
2013/06/25 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
合同专员岗位职责
2013/12/18 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
音乐会主持人开场白
2015/05/28 职场文书
Python中异常处理用法
2021/11/27 Python