怎么使用在Django中的中间件

  介绍

本篇文章为大家展示了怎么使用在Django中的中间件,代码简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强>什么是中间件?

高流量的站点通常需要将Django部署在负载平衡代理之后。这种方式将带来一些复杂性,其一就是每个请求中的远程IP地址(request.META [“REMOTE_IP"])将指向该负载平衡代理,而不是发起这个请求的实际IP。负载平衡代理处理这个问题的方法在特殊的X-Forwarded-For中设置实际发起请求的IP。

因此,需要一个小小的中间件来确保运行在代理之后的站点也能够在request.META (“REMOTE_ADDR")中得到正确的IP地址:

class  SetRemoteAddrFromForwardedFor(对象):   def 才能process_request(自我,,请求):   ,,,试一试:   ,,,,,real_ip =, request.META [& # 39; HTTP_X_FORWARDED_FOR& # 39;】   ,,,except  KeyError:   ,,,,,   ,,,:   ,,,,,#,HTTP_X_FORWARDED_FOR 还要be  a  comma-separated  list  of  IPs。   ,,,,,#,Take  just 从而first 一个。   ,,,,,real_ip =, real_ip.split (“”) [0]   ,,,,,request.META [& # 39; REMOTE_ADDR& # 39;],=real_ip   (注意:,Although 从而HTTP  header  is  nbsp; X-Forwarded-For ,, Django  makes  it  available  as  request.META [& # 39; HTTP_X_FORWARDED_FOR& # 39;],只With 从而exception  of  content-length 以及content-type ,, any  HTTP  headers 拷贝,request 断开连接;converted 用request.META  keys  by  converting  all  characters 用大写字母,,replacing  any  hyphens  With  underscores 以及adding  an  HTTP_  prefix 用,名字。)

一旦安装了该中间件(参见下一节),每个请求中的X-Forwarded-For值都会被自动插入到request.META [& # 39; REMOTE_ADDR& # 39;]中。这样,Django应用就不需要关心自己是否位于负载平衡代理之后,简单读取request.META [& # 39; REMOTE_ADDR& # 39;]的方式在是否有代理的情形下都将正常工作。

实际上,为针对这个非常常见的情形,Django已将该中间件内置。它位于django.middleware。http中,下一节将给出这个中间件相关的更多细节。

<>强安装中间件

要启用一个中间件,只需将其添加到配置模块的MIDDLEWARE_CLASSES元组中。在MIDDLEWARE_CLASSES中,中间件组件用字符串表示:指向中间件类名的完整Python路径。例如,下面是django-admin。py startproject创建的缺省MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES =, (   & # 39;才能django.middleware.common.CommonMiddleware& # 39;   & # 39;才能django.contrib.sessions.middleware.SessionMiddleware& # 39;   & # 39;才能django.contrib.auth.middleware.AuthenticationMiddleware& # 39;   )

Django项目的安装并不强制要求任何中间件,如果你愿意,MIDDLEWARE_CLASSES可以为空。

这里中间件出现的顺序非常重要。在请求和视图的处理阶段,Django按照MIDDLEWARE_CLASSES中出现的顺序来应用中间件,而在反应和异常处理阶段,Django则按逆序来调用它们。也就是说,Django将MIDDLEWARE_CLASSES视为视图函数外层的顺序包装子:在请求阶段按顺序从上到下穿过,而在反应则反过来。

上述内容就是怎么使用在Django中的中间件,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

怎么使用在Django中的中间件