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

时间:2015-02-05 13:58:19

标签: django curl django-rest-framework

我正在使用django rest framework发送一个post请求到我的API:

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

在我的休息框架视图中,我想获取我的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)

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

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

2 个答案:

答案 0 :(得分:39)

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

print request.META

您的标题将以:

的形式提供
request.META['HTTP_X_MYHEADER']

或者:

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

Quote from the documentation

  

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

答案 1 :(得分:0)

如果您提供有效的标题信息并从后端获取该信息,请按照

进行操作
client-name='ABCKD'

然后你在post或get函数中得到了客户信息 -

request.META['HTTP_CLIENT_NAME']

它会为您提供输出' ABCKD'。

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