详解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求导数的方法
May 09 Python
在Python中操作字典之clear()方法的使用
May 21 Python
python kmeans聚类简单介绍和实现代码
Feb 23 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
Jun 26 Python
Django上使用数据可视化利器Bokeh解析
Jul 31 Python
pymysql的简单封装代码实例
Jan 08 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
Jun 04 Python
使用keras实现非线性回归(两种加激活函数的方式)
Jul 05 Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 Python
python缺失值填充方法示例代码
Dec 24 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模板引擎之导入资源文件方法详解
2014/06/18 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
使用JS操作页面表格,元素的一些技巧
2007/02/02 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
JavaScript window.location对象
2014/11/14 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
2016/10/27 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
JS实现百度搜索框
2021/02/25 Javascript
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
解决uWSGI的编码问题详解
2017/03/24 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
解决使用export_graphviz可视化树报错的问题
2019/08/09 Python
python matplotlib拟合直线的实现
2019/11/19 Python
Python安装与卸载流程详细步骤(图解)
2020/02/20 Python
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
2014年大学生自我评价
2014/01/19 职场文书
秋季红领巾广播稿
2014/01/27 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
自查自纠整改报告
2014/11/06 职场文书
先进工作者申报材料
2014/12/23 职场文书
python 中的@运算符使用
2021/05/26 Python
纯html+css实现Element loading效果
2021/08/02 HTML / CSS
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang