详解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 相关文章推荐
Hadoop中的Python框架的使用指南
Apr 22 Python
用Python编写简单的定时器的方法
May 02 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
python手写均值滤波
Feb 19 Python
基于Python把网站域名解析成ip地址
May 25 Python
Python如何定义有默认参数的函数
Aug 10 Python
总结python 三种常见的内存泄漏场景
Nov 20 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
Python 实现PS滤镜的旋涡特效
Dec 03 Python
python中_del_还原数据的方法
Dec 09 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使用date和strtotime函数输出指定日期的方法
2014/11/14 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
php实现图片转换成ASCII码的方法
2015/04/03 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
php实现文件上传基本验证
2020/03/04 PHP
jqgrid 简单学习笔记
2011/05/03 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
Python sublime安装及配置过程详解
2020/06/29 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
大学生个人自我鉴定
2013/12/03 职场文书
七一讲话心得体会
2014/09/05 职场文书
2014第二批党的群众路线教育实践活动对照检查材料思想汇报
2014/09/18 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS
Python实现简单的猜单词
2021/06/15 Python