详解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中各种方法的运作原理
Jun 15 Python
在Django中限制已登录用户的访问的方法
Jul 23 Python
python基础while循环及if判断的实例讲解
Aug 25 Python
解决python报错MemoryError的问题
Jun 26 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
Jul 04 Python
python实现汉诺塔算法
Mar 01 Python
Django实现学生管理系统
Feb 26 Python
python实现抽奖小程序
Apr 15 Python
用python3 返回鼠标位置的实现方法(带界面)
Jul 05 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Jun 03 Python
Python进程池与进程锁之语法学习
Apr 11 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
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
javascript void(0)的妙用
2009/10/21 Javascript
jquery插件 cluetip 关键词注释
2010/01/12 Javascript
this和执行上下文实现代码
2010/07/01 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
python 合并文件的具体实例
2013/08/08 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
Python中Threading用法详解
2017/12/27 Python
Python实现的knn算法示例
2018/06/14 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
django用户登录验证的完整示例代码
2019/07/21 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
python的setattr函数实例用法
2020/12/16 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
建筑工程实习自我鉴定
2013/09/19 职场文书
拾金不昧的表扬信
2014/01/16 职场文书
违章停车检讨书
2014/10/21 职场文书
建国大业观后感600字
2015/06/01 职场文书
中学总务处工作总结
2015/08/12 职场文书
《大禹治水》教学反思
2016/02/22 职场文书