如何在Django中获取所有请求标头?

Mri*_*lla 93 python django httprequest http-headers

我需要获取所有Django请求标头.根据我的阅读,Django只需将所有内容request.META与其他数据一起转储到变量中.获取客户端发送到我的Django应用程序的所有头文件的最佳方法是什么?

我将使用这些来构建httplib请求.

Man*_*dan 129

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

您执行此操作的代码部分取决于您的确切要求.任何有权访问的地方都request应该这样做.

更新

我需要在Middleware类中访问它,但是当我迭代它时,除了HTTP头之外,我获得了很多值.

从文档:

除了CONTENT_LENGTH和之外CONTENT_TYPE,如上所述,HTTP请求中的任何标头都将转换为META键,方法是将所有字符转换为大写,用下划线替换任何连字符并在名称中添加HTTP_前缀.

(重点补充)

HTTP单独获取标题,只需使用前缀为的键进行过滤HTTP_.

更新2

你能告诉我如何通过过滤掉以HTTP_开头的request.META变量并删除前导HTTP_部分的所有键来构建标题字典.

当然.这是一种方法.

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

  • @Mridang Agarwalla:`lstrip`实际上不会做你要求它做的事.`lstrip`将删除所有与你给它的字符串中的任何字符匹配的前导字符,所以如果你有一个标题`"HTTP_TOKEN_ID"`它将返回`"OKEN_ID"`,因为``T"` "TOKEN"的开头`匹配传递给lstrip的字符串中的字符.做到这一点的方法是`prefix ='HTTP_'; header = header [len(prefix):]`. (3认同)
  • Django 2.2 已经支持`HttpRequest.headers`。 (2认同)

Dav*_*her 17

这是另一种方法,非常类似于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]
Run Code Online (Sandbox Code Playgroud)

这也将获取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的请求标头算法:

  1. -用下划线替换连字符_
  2. 转换为大写.
  3. 预先考虑HTTP_到所有的头在原来的要求,除了CONTENT_TYPECONTENT_LENGTH.

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

  • 这可以全部组合成一个正则表达式,`re.compile(r'^(HTTP _.+ | CONTENT_TYPE | CONTENT_LENGTH)$') (5认同)

Dan*_*per 15

从Django 2.2开始,您可以request.headers用来访问HTTP标头。从HttpRequest.headers文档中

不区分大小写,类似于dict的对象,可从请求中访问所有HTTP前缀的标头(加上Content-Length和Content-Type)。

每个标题的名称在显示时都带有标题框(例如User-Agent)。您可以不区分大小写地访问标头:

>>> request.headers
{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...}

>>> 'User-Agent' in request.headers
True
>>> 'user-agent' in request.headers
True

>>> request.headers['User-Agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers['user-agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)

>>> request.headers.get('User-Agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get('user-agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
Run Code Online (Sandbox Code Playgroud)

要获取所有标题,可以使用request.headers.keys()request.headers.items()


Kus*_*era 9

简单地说,您可以从Django 2.2开始使用HttpRequest.headers。以下示例直接取自请求和响应对象部分下的官方Django 文档

>>> request.headers
{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...}

>>> 'User-Agent' in request.headers
True
>>> 'user-agent' in request.headers
True

>>> request.headers['User-Agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers['user-agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)

>>> request.headers.get('User-Agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get('user-agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
Run Code Online (Sandbox Code Playgroud)


小智 5

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

你可以从这个文件中获得...