Python 如何在Django中获取所有请求头?
我需要得到所有Django请求头。据我所知,Django只是将所有内容与大量其他数据一起转储到Python 如何在Django中获取所有请求头?,python,django,http-headers,httprequest,Python,Django,Http Headers,Httprequest,我需要得到所有Django请求头。据我所知,Django只是将所有内容与大量其他数据一起转储到request.META变量中。获取客户机发送到我的Django应用程序的所有头文件的最佳方法是什么 我将使用它们来构建一个httplib请求。根据请求。META是一个“包含所有可用HTTP头的标准Python字典”。如果你想得到所有的标题,你可以简单地遍历字典 代码的哪一部分可以这样做取决于您的具体需求。任何可以访问请求的地方都应该这样做 更新 我需要在中间件类中访问它,但是当我迭代它时,除了HTTP
request.META
变量中。获取客户机发送到我的Django应用程序的所有头文件的最佳方法是什么
我将使用它们来构建一个httplib
请求。根据请求。META
是一个“包含所有可用HTTP头的标准Python字典”。如果你想得到所有的标题,你可以简单地遍历字典
代码的哪一部分可以这样做取决于您的具体需求。任何可以访问请求的地方都应该这样做
更新
我需要在中间件类中访问它,但是当我迭代它时,除了HTTP头之外,我还得到了很多值
从文件中:
除了CONTENT\u LENGTH
和CONTENT\u TYPE
之外,如上所述,请求中的任何HTTP
头都将转换为META
键,方法是将所有字符转换为大写,用下划线替换任何连字符,并为名称添加HTTP
前缀
(增加重点)
要单独获取HTTP
头,只需按前缀为HTTP\ucode>的键进行筛选即可
更新2
你能告诉我如何从request.META变量中筛选出所有以HTTP_u开头的键并去掉前面的HTTP_u部分,从而构建一个标题字典吗
当然。这里有一种方法
import re
regex = re.compile('^HTTP_')
dict((regex.sub('', header), value) for (header, value)
in request.META.items() if header.startswith('HTTP_'))
我认为没有任何简单的方法可以只获取HTTP头。您必须遍历request.META dict才能获得所需的全部内容
django调试工具栏采用相同的方法显示标题信息。查看负责检索标题信息的。这是另一种方法,与上面的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\u TYPE
和CONTENT\u LENGTH
请求头,以及HTTP\u
头<代码>请求头['some\u key]
=request.META['some\u key']
如果需要包含/省略某些标题,请相应修改。Django在这里列出了一系列,但不是全部:
Django的请求头算法:
将连字符-
替换为下划线。
转换成大写
将HTTP\u
预先发送到原始请求中的所有头,但CONTENT\u TYPE
和CONTENT\u LENGTH
除外
每个头的值都应该不被修改。不管怎样,您的目的似乎是使用传入的HTTP请求来形成另一个HTTP请求。有点像网关。有一个很好的模块可以实现这一点
该源代码是一个很好的参考资料,可以帮助您完成所要做的事情。request.META.get('HTTP\u AUTHORIZATION'))
<b>request.META</b><br>
{% for k_meta, v_meta in request.META.items %}
<code>{{ k_meta }}</code> : {{ v_meta }} <br>
{% endfor %}
/python3.6/site packages/rest\u framework/authentication.py
您可以从这个文件中获取…如果您想从请求头获取客户端密钥,您可以尝试以下操作:
from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
from apps.authentication.models import CerebroAuth
class CerebroAuthentication(BaseAuthentication):
def authenticate(self, request):
client_id = request.META.get('HTTP_AUTHORIZATION')
if not client_id:
raise exceptions.AuthenticationFailed('Client key not provided')
client_id = client_id.split()
if len(client_id) == 1 or len(client_id) > 2:
msg = ('Invalid secrer key header. No credentials provided.')
raise exceptions.AuthenticationFailed(msg)
try:
client = CerebroAuth.objects.get(client_id=client_id[1])
except CerebroAuth.DoesNotExist:
raise exceptions.AuthenticationFailed('No such client')
return (client, None)
从Django 2.2开始,您可以使用request.headers
访问HTTP头。从:
一个不区分大小写、类似dict的对象,提供对请求中所有HTTP前缀头(加上内容长度和内容类型)的访问
每个标题的名称在显示时使用标题框(例如用户代理)进行样式化。您可以不区分大小写地访问标题:
>>> 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)
要获取所有标题,您可以使用request.headers.keys()
或request.headers.items()
只需从开始使用即可。以下示例直接取自第节下的官员
>>request.headers
{'User-Agent':'Mozilla/5.0(Macintosh;英特尔Mac OS X 10_12_6',…}
>>>request.headers中的“用户代理”
真的
>>>request.headers中的“用户代理”
真的
>>>request.headers['User-Agent']
Mozilla/5.0(Macintosh;英特尔Mac OS X 10_12_6)
>>>request.headers['user-agent']
Mozilla/5.0(Macintosh;英特尔Mac OS X 10_12_6)
>>>request.headers.get('User-Agent')
Mozilla/5.0(Macintosh;英特尔Mac OS X 10_12_6)
>>>request.headers.get('user-agent')
Mozilla/5.0(Macintosh;英特尔Mac OS X 10_12_6)
我需要在中间件类中访问它,但是当我迭代它时,除了HTTP头之外,我还得到了很多值。谢谢Manoj。只是出于好奇-你能告诉我如何通过从请求.META
变量中过滤掉所有以HTTP\ucode>开头的键并去掉e引导HTTP\uu
部分。这是否可以通过lambda函数实现?(我认为它们被称为lambda函数)我问这个问题是因为我可能会继续做很长的一段时间,首先对它们进行迭代,然后检查它是否以HTTP
开头,然后将其添加到新词典中。再次感谢。再次感谢Manoj。我稍微修改了它,使用lstrip('HTTP
),而不是regex.)@Mridang Agarwalla:lstrip
实际上不会执行您要求它执行的操作lstrip
将去掉与您提供的字符串中任何字符匹配的所有前导字符,因此如果您有一个头“HTTP\u TOKEN\u ID”
它将返回“OKEN\u ID”
,因为“TOKEN”
开头的“T”
与传递给lstrip的字符串中的一个字符匹配。方法是prefix='HTTP_';header=header[len(前缀):]
.Django 2.2支持HttpRequest.headers
。它们都可以组合成一个regexp,re.compile(r'^(HTTP.+\124; CONTENT\u TYPE | CONTENT\u LENGTH)$)