Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中获取所有请求头?_Python_Django_Http Headers_Httprequest - Fatal编程技术网

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

Python 如何在Django中获取所有请求头?,python,django,http-headers,httprequest,Python,Django,Http Headers,Httprequest,我需要得到所有Django请求头。据我所知,Django只是将所有内容与大量其他数据一起转储到request.META变量中。获取客户机发送到我的Django应用程序的所有头文件的最佳方法是什么 我将使用它们来构建一个httplib请求。根据请求。META是一个“包含所有可用HTTP头的标准Python字典”。如果你想得到所有的标题,你可以简单地遍历字典 代码的哪一部分可以这样做取决于您的具体需求。任何可以访问请求的地方都应该这样做 更新 我需要在中间件类中访问它,但是当我迭代它时,除了HTTP

我需要得到所有Django请求头。据我所知,Django只是将所有内容与大量其他数据一起转储到
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)$)