详解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 相关文章推荐
python3写的简单本地文件上传服务器实例
Jun 04 Python
python 使用正则表达式按照多个空格分割字符的实例
Dec 20 Python
浅谈PySpark SQL 相关知识介绍
Jun 14 Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 Python
python实现两个字典合并,两个list合并
Dec 02 Python
Django之form组件自动校验数据实现
Jan 14 Python
Django 解决由save方法引发的错误
May 21 Python
pandas参数设置的实用小技巧
Aug 23 Python
如何通过python实现IOU计算代码实例
Nov 02 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 Python
深入理解pytorch库的dockerfile
Jun 10 Python
python 镜像环境搭建总结
Sep 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 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
详解Vue生命周期的示例
2017/03/10 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
用Vue写一个分页器的示例代码
2018/04/22 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
Python入门_条件控制(详解)
2017/05/16 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
python中时间、日期、时间戳的转换的实现方法
2019/07/06 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
关于Python错误重试方法总结
2021/01/03 Python
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
国际领先的学术出版商:Springer
2017/01/11 全球购物
市场营销专业个人求职信范文
2013/12/14 职场文书
探亲假请假条
2014/04/11 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
党员承诺书怎么写
2014/05/20 职场文书
2014年车间工作总结
2014/11/21 职场文书
工程部部长岗位职责
2015/02/12 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers