ros*_*hal 5 python django django-rest-framework
当我通过 @api_view装饰器。
我的自定义 API 视图如下所示:
@api_view(['GET'])
def TestView(request):
print(request.META)
return Response({'message': 'test'})
Run Code Online (Sandbox Code Playgroud)
我期待的是做类似的事情
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:
Run Code Online (Sandbox Code Playgroud)
然而,它们根本没有出现在我的输出中。我在这里错过了什么吗?
如果相关,我将我的 URL 注册为:
urlpatterns = [url(r'test', views.TestView, name='test'), ...]
我的最终目标是编写一个自定义权限类,该类将解析自定义标头并使用它执行与身份验证相关的操作,并允许或拒绝请求。我在这里的 POC 只是为了展示我正在处理的基本示例。我可以提供输出,print(request.META)但它只是一堵没有我预期标题的文本墙。
Django 会添加HTTP_到自定义标头中。我认为(但不确定)它可能与此处描述的一些安全问题有关。它还将它们大写,所以你的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'})
Run Code Online (Sandbox Code Playgroud)
正确输出(如果日志记录已按照此处所述正确配置):
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
Run Code Online (Sandbox Code Playgroud)
另外,正如您在上面的输出中看到的,当 API 被点击时,Django 会给出 301 重定向(我相信这是出于身份验证目的?也不确定),因此您必须使用以下命令告诉您的 cURL 遵循重定向--location:
curl --location --request GET \
--header 'custom: test' http://localhost:8000/test
Run Code Online (Sandbox Code Playgroud)
-另请注意,标头名称中的所有连字符 ( ) 都会转换为下划线符号 ( _),因此如果您将标头命名为my-custom,Django 会将其转换为HTTP_MY_CUSTOM
| 归档时间: |
|
| 查看次数: |
5236 次 |
| 最近记录: |