我怎样才能得到Django中的所有请求标题?

我需要得到所有的Django请求头。 从我读过的内容来看,Django只是简单地把所有的东西都转储到request.METAvariables中,并且还有很多其他的数据。 什么是最好的方式来获得客户端发送到我的Django应用程序的所有标题?

我将使用这些来build立一个httplib请求。

根据文档 request.META是一个“包含所有可用的HTTP标题的标准Python字典”。 如果你想获得所有的头文件,你可以简单地遍历字典。

你的代码的哪一部分取决于你的确切需求。 任何有权访问的地方都应该这样做。

更新

我需要在中间件类中访问它,但是当我迭代它时,除了HTTP头之外,还有很多值。

从文档:

除了CONTENT_LENGTHCONTENT_TYPE ,如上所述,请求中的所有HTTP标题都将转换为META键,方法是将所有字符转换为大写,将所有连字符replace为下划线, 并向该名称添加HTTP_前缀

(强调添加)

要单独获取HTTP头,只需使用以HTTP_为前缀的键进行过滤。

更新2

你能告诉我怎样才能build立一个标题的字典,从request.METAvariables中以HTTP_开始,并且去掉前面的HTTP_部分。

当然。 这是一个办法。

 import re regex = re.compile('^HTTP_') dict((regex.sub('', header), value) for (header, value) in request.META.items() if header.startswith('HTTP_')) 

这是另一种方式,与Manoj Govindan的回答非常相似:

 import re regex_http_ = re.compile(r'^HTTP_.+$') regex_content_type = re.compile(r'^CONTENT_TYPE$') regex_content_length = re.compile(r'^CONTENT_LENGTH$') request_headers = {} for header in request.META: if regex_http_.match(header) or regex_content_type.match(header) or regex_content_length.match(header): request_headers[header] = request.META[header] 

这也将抓取CONTENT_TYPECONTENT_LENGTH请求头,以及HTTP_的。 request_headers['some_key] == request.META['some_key']

如果您需要包含/省略某些标题,请相应地进行修改。 Django在这里列出了一堆,但不是全部: https : //docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META

Django的请求标题的algorithm:

  1. replace连字符-用下划线_
  2. 转换成大写。
  3. HTTP_到原始请求中的所有标题, CONTENT_TYPECONTENT_LENGTH除外。

每个标题的值应该是未修改的。

我不认为有任何简单的方法只获得HTTP头。 你必须遍历request.META字典来得到你所需要的。

django-debug-toolbar采用相同的方法来显示标题信息。 看看这个文件负责检索标题信息。

对于它的价值,看来你的意图是使用传入的HTTP请求来形成另一个HTTP请求。 有点像网关。 有一个很好的模块django-revproxy完成这个。

关于如何完成你所要做的事情,这个源码是一个很好的参考。

request.META.get('HTTP_AUTHORIZATION')/ /python3.6/site-packages/rest_framework/authentication.py

你可以从这个文件,但是…

 <b>request.META</b><br> {% for k_meta, v_meta in request.META.items %} <code>{{ k_meta }}</code> : {{ v_meta }} <br> {% endfor %}