详解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 相关文章推荐
初步剖析C语言编程中的结构体
Jan 16 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
python获取网页中所有图片并筛选指定分辨率的方法
Mar 31 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
python 处理string到hex脚本的方法
Oct 26 Python
django中上传图片分页三级联动效果的实现代码
Aug 30 Python
详解pycharm连接不上mysql数据库的解决办法
Jan 10 Python
python 负数取模运算实例
Jun 03 Python
Python logging日志模块 配置文件方式
Jul 12 Python
Python return语句如何实现结果返回调用
Oct 15 Python
python自动化之如何利用allure生成测试报告
May 02 Python
用Python实现一个打字速度测试工具来测试你的手速
May 28 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
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
JavaScript闭包实例讲解
2014/04/22 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
python中的错误处理
2016/04/10 Python
Python中操作符重载用法分析
2016/04/29 Python
Python在图片中添加文字的两种方法
2017/04/29 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
浅谈Pytorch中的torch.gather函数的含义
2019/08/18 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
文明之星事迹材料
2014/05/09 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
公民授权委托书
2014/10/15 职场文书
团代会邀请函
2015/02/02 职场文书
酒桌上的开场白
2015/06/01 职场文书
七年级作文之游记
2019/12/11 职场文书
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
Win11查看设备管理器
2022/04/19 数码科技