使用django rest框架在post请求上获取自定义标头

And*_*oga 23 django curl django-rest-framework

我正在使用django rest框架向我的API发送一个帖子请求:

curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/
Run Code Online (Sandbox Code Playgroud)

在我的休息框架视图中,我想获取我的costum标头,如果自定义标头满足条件,我将继续分析我的帖子数据.

好的,我的观点看起来像:

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)
Run Code Online (Sandbox Code Playgroud)

我正在尝试在request.Meta元素上找到我的自定义标题,但是当我打印request.Meta时,我收到500错误.如果我打印request.data,我会得到预期的响应.

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

cat*_*ran 43

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

print request.META
Run Code Online (Sandbox Code Playgroud)

您的标题将显示为:

request.META['HTTP_X_MYHEADER']
Run Code Online (Sandbox Code Playgroud)

要么:

request.META.get('HTTP_X_MYHEADER') # return `None` if no such header
Run Code Online (Sandbox Code Playgroud)

从文档中引用:

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

  • 将“ curl”的输出重定向到文件,然后在浏览器中打开该文件。卷曲... http://127.0.0.1:8000/api/update_log/> error.html` (2认同)

jbo*_*oot 18

看到这是一篇旧文章,我想我应该分享自 Django 2.2 以来可用的更新且更灵活的方法。您可以使用请求的标头对象

# 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"
Run Code Online (Sandbox Code Playgroud)

最大的区别request.META是,它request.headers不会在标头前面添加HTTP_,它不会将标头名称转换为UPPER_SNAKE_CASE,并且可以不区分大小写地访问标头。它只会在显示时将标题转换为Title-Casing(例如X-Myheader)。


Meh*_*san 9

如果您提供有效的标头信息并从后端获取该信息,请遵循这些

client-name='ABCKD'
Run Code Online (Sandbox Code Playgroud)

那么你已经在 post 或 get 函数中获得了该客户信息 -

request.META['HTTP_CLIENT_NAME']
Run Code Online (Sandbox Code Playgroud)

它会给你输出'ABCKD'。

请记住,无论您在请求的标头信息中提供的有效变量名称是什么,django 都会将其转换为大写并以 ' HTTP_' 为前缀,在这里它将客户端名称转换为CLIENT_NAME并以HTTP_.为前缀。所以最终输出是 HTTP_CLIENT_NAME