【问题标题】:Django REST Framework custom headers in request object [duplicate]请求对象中的 Django REST Framework 自定义标头 [重复]
【发布时间】:2017-12-27 21:55:19
【问题描述】:

当我通过 @api_view 装饰器创建新的 API 视图时,我在查看来自请求的传入自定义标头时遇到问题。

我的自定义 API 视图如下所示:

 @api_view(['GET'])
 def TestView(request):
   print(request.META)
   return Response({'message': 'test'})

我期待的是做类似的事情

curl --request GET \ --url http://localhost:8000/test \ --header 'custom: test'

我会看到名为custom 的自定义标头出现在输出中。相反,它根本不存在。从文档中,它对 request.META 字段表示以下内容:

A dictionary containing all available HTTP headers. Available headers depend on the client and server, but here are some examples:

然而,它们根本没有出现在我的输出中。我在这里遗漏了什么吗?

如果相关,我会这样注册我的网址:

urlpatterns = [url(r'test', views.TestView, name='test'), ...]

我的最终目标是编写一个自定义权限类,该类将解析自定义标头并使用它执行与身份验证相关的操作,并允许或拒绝请求。我在这里的 POC 只是为了展示我正在处理的基本示例。我可以提供print(request.META) 的输出,但它只是一堵没有我预期标题的文本墙。

【问题讨论】:

  • 错了。不是重复的,我在我的问题中明确声明我知道如何访问标题并且它不存在。
  • @rosenthal,重复并不坏,至少对我来说不是。我什至写了一个答案(你好心地选择了,很感激)即使我是重复的。至少对我来说,它们只是表达“嘿,这里可能有更多信息” :)
  • 留下我的评论,不想删除它。我错了,老实说,它是重复的,并且有时提醒自己要检查自己。

标签: python django django-rest-framework


【解决方案1】:

Django 将HTTP_ 添加到自定义标头中。我认为(虽然不确定)这可能与here 描述的一些安全问题有关。它还将它们大写,因此您的 custom 标头变为 HTTP_CUSTOM

from rest_framework.decorators import api_view
from rest_framework.response import Response

import logging

logger = logging.getLogger('django.test')

@api_view(['GET'])
def TestView(request):
    logger.info('Meta: %s' % request.META['HTTP_CUSTOM'])
    return Response({'message': 'test'})

正确输出(如果已按照here 所述正确配置日志记录):

Django version 2.0, using settings 'django_server.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
"GET /test HTTP/1.1" 301 0
Meta: test
"GET /test/ HTTP/1.1" 200 18

此外,正如您在上面的输出中看到的那样,当 API 被命中时,Django 会提供 301 重定向(我相信这是出于身份验证目的?也不确定)所以您必须告诉您的 cURL 遵循重定向使用--location:

curl --location --request GET \
     --header 'custom: test' http://localhost:8000/test

还要注意,标题名称中的所有连字符 (-) 都转换为下划线符号 (_),因此如果您将标题称为 my-custom,Django 会将其转换为 HTTP_MY_CUSTOM

【讨论】:

  • 您的答案与我已经阅读的文档所说的几乎完全一样,但不知何故我仍然错过了它最终被转储的事实。我可以发誓我没有看到它,但我现在看到它出现了。欣赏多出来的一双眼睛
  • 哈哈...是的,它发生在我们所有人/许多人身上:stackoverflow.com/questions/45827690/…
猜你喜欢
  • 1970-01-01
  • 2015-09-25
  • 2019-04-04
  • 2020-06-21
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
相关资源
最近更新 更多