我怎样才能得到Django中的所有请求标题?
我需要得到所有的Django请求头。 从我读过的内容来看,Django只是简单地把所有的东西都转储到request.META
variables中,并且还有很多其他的数据。 什么是最好的方式来获得客户端发送到我的Django应用程序的所有标题?
我将使用这些来build立一个httplib
请求。
根据文档 request.META
是一个“包含所有可用的HTTP标题的标准Python字典”。 如果你想获得所有的头文件,你可以简单地遍历字典。
你的代码的哪一部分取决于你的确切需求。 任何有权访问的地方都应该这样做。
更新
我需要在中间件类中访问它,但是当我迭代它时,除了HTTP头之外,还有很多值。
从文档:
除了
CONTENT_LENGTH
和CONTENT_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_TYPE
和CONTENT_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:
- replace连字符
-
用下划线_
- 转换成大写。
- 将
HTTP_
到原始请求中的所有标题,CONTENT_TYPE
和CONTENT_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 %}