详解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使用电子邮件模块smtplib的方法
Aug 28 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
Apr 05 Python
python数字图像处理之骨架提取与分水岭算法
Apr 27 Python
解决Python一行输出不显示的问题
Dec 03 Python
linux查找当前python解释器的位置方法
Feb 20 Python
Python利用pandas处理Excel数据的应用详解
Jun 18 Python
python文件读写代码实例
Oct 21 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 Python
谈谈python垃圾回收机制
Sep 27 Python
python调用百度AI接口实现人流量统计
Feb 03 Python
浅谈pytorch中stack和cat的及to_tensor的坑
May 20 Python
python 中的jieba分词库
Nov 23 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提交后跳转
2013/06/23 PHP
PHP利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
php生成圆角图片的方法
2015/04/07 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
JS实现滑动门效果的方法详解
2016/12/19 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
Webpack path与publicPath的区别详解
2018/05/03 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
Python 爬虫的工具列表大全
2016/01/31 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
2018/04/24 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
如何获取Python简单for循环索引
2019/11/21 Python
python 导入数据及作图的实现
2019/12/03 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
一款纯css3实现的非常实用的鼠标悬停特效演示
2014/11/05 HTML / CSS
化工专业推荐信范文
2013/11/28 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
合作协议书格式范本
2016/03/21 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
从贫穷到富有,是知识技能和学习力的差别
2019/08/20 职场文书