详解Python的Django框架中的中间件

 更新时间:2015年07月24日 11:29:56   投稿:goldensun  
这篇文章主要介绍了详解Python的Django框架中的中间件,包括中间件的安装等内容,需要的朋友可以参考下

什么是中间件

我们从一个简单的例子开始。

高流量的站点通常需要将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如何用pip命令升级所有可以升级的(过时的)包

    Python如何用pip命令升级所有可以升级的(过时的)包

    这篇文章主要介绍了Python如何用pip命令升级所有可以升级的(过时的)包,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • python保留小数函数的几种使用总结

    python保留小数函数的几种使用总结

    本文主要介绍了python保留小数函数的几种使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 玩转python爬虫之cookie使用方法

    玩转python爬虫之cookie使用方法

    Cookie用于服务器实现会话,用户登录及相关功能时进行状态管理,这篇文章主要介绍了使用python处理cookie的方法,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • python matplotlib库绘制散点图例题解析

    python matplotlib库绘制散点图例题解析

    这篇文章主要介绍了python matplotlib库绘制散点图例题解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python 私有化操作实例分析

    Python 私有化操作实例分析

    这篇文章主要介绍了Python 私有化操作,结合实例形式分析了Python私有属性、私有方法相关使用技巧,需要的朋友可以参考下
    2019-11-11
  • Python tkinter之Bind(绑定事件)的使用示例

    Python tkinter之Bind(绑定事件)的使用示例

    这篇文章主要介绍了Python tkinter之Bind(绑定事件)的使用详解,帮助大家更好的理解和学习python的gui开发,感兴趣的朋友可以了解下
    2021-02-02
  • python 使用Tensorflow训练BP神经网络实现鸢尾花分类

    python 使用Tensorflow训练BP神经网络实现鸢尾花分类

    这篇文章主要介绍了python 使用Tensorflow训练BP神经网络实现鸢尾花分类,帮助大家更好的利用python进行深度学习,感兴趣的朋友可以了解下
    2021-05-05
  • 理解Python垃圾回收机制

    理解Python垃圾回收机制

    这篇文章主要为大家详细介绍了Python垃圾回收机制,Python中的垃圾回收以引用计数为主,分代收集为辅,想要深入理解Python垃圾回收机制,请阅读下文
    2016-02-02
  • Python基于有道实现英汉字典功能

    Python基于有道实现英汉字典功能

    这篇文章主要介绍了Python基于有道实现英汉字典功能的方法,通过调用有道查询接口实现英汉字典功能,简单实用,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 如何用Python实现自动发送微博

    如何用Python实现自动发送微博

    大家好,本篇文章主要讲的是如何用Python实现自动发送微博,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏
    2022-01-01

最新评论