通过@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:
而它们根本不出现在我的输出中。我在这里想念什么吗?
如果相关,我会这样注册我的URL:
urlpatterns = [url(r'test', views.TestView, name='test'), ...]
我的最终目标是编写一个自定义权限类,该类将解析自定义标头并执行与它相关的身份验证,然后允许或拒绝该请求。我在这里的POC只是显示我正在处理的基本示例。我可以提供的输出,print(request.META)
但这只是一堵墙,没有我期望的标题。
DjangoHTTP_
会使用自定义标头。我认为(虽然不确定)可能与此处描述的一些安全问题有关。它还将它们大写,因此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'})
正确输出(如果已按照此处所述正确配置日志记录):
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句