当前位置: 首页 > 知识库问答 >
问题:

如何在Django Rest框架上访问自定义HTTP请求头?

岑俊弼
2023-03-14

我正在向使用django rest框架生成的API发送post请求:

curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/

在我的rest框架视图中,我想获取Costam头,如果自定义头满足一个条件,我将继续分析我的post数据。

好的,我的观点如下:

class PostUpdateLogView(APIView):
    throttle_classes = ()
    permission_classes = ()
    parser_classes = (
        parsers.FormParser,
        parsers.MultiPartParser,
        parsers.JSONParser,
    )  

    renderer_classes = (renderers.JSONRenderer,)

    def post(self, request):
        print request.Meta
        # Get custom header
        # Validate custom header
        # Proceed to analize post data

        # Make response
        content = {
            'response': 'response',
        }

        return Response(content)

我正试图根据请求查找我的自定义标题。元元素,但当我打印请求时。梅塔,我有500个错误。如果我打印请求。数据,我得到了预期的响应。

使用django rest框架在我的帖子请求上获得自定义标题的方法是什么?

共有3个答案

景阳平
2023-03-14

看到这是一篇老文章,我想我会分享自Django 2.2以来提供的更新和更灵活的方法。您可以使用请求的headers对象:

# curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/

request.headers['X-MYHEADER']       # returns "123"
request.headers['x-myheader']       # case-insensitive, returns the same
request.headers.get('x-myheader')   # returns None if header doesn't exist

# standard headers are also available here
request.headers.get('Content-Type') # returns "application/x-www-form-urlencoded"

请求的最大区别。META是指request.headers不以HTTP_前缀标头,它不将标头名称转换为UPPER_SNAKE_CASE,并且标头可以不区分大小写地访问。它只会在显示时将标题转换为标题-外壳(例如X-Myhead)。

劳灵均
2023-03-14

如果您提供了一个有效的头信息,并从后端获取该信息,那么请遵循以下步骤

client-name='ABCKD'

然后您就可以在post中获取客户机信息,或者在下面的get函数中获取客户机信息-

request.META['HTTP_CLIENT_NAME']

它将为您提供输出“ABCKD”。

请记住,无论您在请求的头信息中提供的有效变量名是什么,django都会将其大写并以“HTTP\u”作为前缀,在这里,它会将客户端名称转换为client\u name并以HTTP\u作为前缀。所以最后的输出是HTTP_客户机_名称

薛墨一
2023-03-14

请求的元数据属性的名称为大写:

print request.META

如果您的标头名为"My-Header",您的标头将以以下方式提供:

request.META['HTTP_MY_HEADER']

或:

request.META.get('HTTP_MY_HEADER') # return `None` if no such header

从留档报价:

通过将所有字符转换为大写,用下划线替换任何连字符并在名称中添加HTTP_前缀,将请求中的HTTP标头转换为META键。因此,例如,名为X-Bender的标头将映射到METAHTTP_X_BENDER

 类似资料:
  • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代

  • 我想将带有JSON对象的POST请求发送到指定的URL,但总是失败。 我已经检查了每个数据,以确保它们是正确的,但当我发送它们时,它们似乎被更改了,因此目标服务器无法正确处理我的请求。 我想这可能是appid中的错误。回复总是告诉我appid不正确,即使我百分之百确定它是正确的。下面是appid参数的格式:name:appid type:INT,但17位数字的INT完全超出范围。 响应:{“err

  • 问题内容: 使用urllib2.urlopen(..)时,我想在请求中发送自定义的“ Accept”标头。我怎么做? 问题答案: 不完全的。创建对象实际上并不发送请求,并且Request对象没有方法。(还:是小写字母。)您需要做的就是将用作第一个参数,这将给您您的答复。

  • 问题内容: 如何修改参数以发送请求,如下所示: “获取www.sample.com HTTP / 1.0” “获取www.sample.com HTTP / 1.1” 问题答案: 请求不支持发送HTTP / 1.0消息。很难理解为什么需要这样做:HTTP / 1.1最初是在1999年6月发布的RFC 2616中指定的。因此,HTTP / 1.0已经过时了16年以上:现代工具在很大程度上不支持HTT

  • 根据AWS文档,API网关使用以下输入调用自定义授权器。基于以下,我假设我的要求是不可能的。但希望检查是否有解决方法。

  • 问题内容: 我在中的代码: 在“ settings.py”中: 但我得到一个错误: 问题答案: 在该范围内不是变量。你必须首先从上下文中获取它。传递t给装饰器并添加context到tag参数。 像这样: