如何在Django Rest框架上访问自定义HTTP请求头?

如何在Django Rest框架上访问自定义HTTP请求头?,django,curl,django-rest-framework,http-headers,Django,Curl,Django Rest Framework,Http Headers,我正在向使用django rest框架生成的API发送post请求: curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/ 在我的rest框架视图中,我想获取Costam头,如果自定义头满足一个条件,我将继续分析我的post数据 好的,我的观点如下: class PostUpdateLogView(APIView): throttle_classes = ()

我正在向使用django rest框架生成的API发送post请求:

curl --header "X-MyHeader: 123" --data "test=test" http://127.0.0.1:8000/api/update_log/
在我的rest框架视图中,我想获取Costam头,如果自定义头满足一个条件,我将继续分析我的post数据

好的,我的观点如下:

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 framework在我的post请求上获取自定义头的方法是什么?

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

print request.META
您的标题将作为以下内容提供:

request.META['HTTP_X_MYHEADER']
或:

:

通过将所有字符转换为大写,将所有连字符替换为下划线,并在名称中添加
HTTP
前缀,请求中的HTTP头将转换为
META
键。因此,例如,名为
X-Bender
的头将映射到
META
HTTP\u X\u Bender


如果您提供了一个有效的头信息,并从后端获取该信息,那么请遵循以下步骤

client-name='ABCKD'
然后您就可以在post中获取客户机信息,或者在下面的get函数中获取客户机信息-

request.META['HTTP_CLIENT_NAME']
它将为您提供输出“ABCKD”

请记住,无论您在请求中的头信息中提供的有效变量名是什么,django都会将其转换为大写,并使用“
HTTP
”作为前缀 在这里,它将客户端名称转换为
client\u name
,并以
HTTP\u
作为前缀。
所以最后的输出是HTTP_CLIENT_NAME

对不起,就像一个丢失的(;),我在这上面花了两个小时。。。也许,当我使用curl请求api时,您知道如何查看bug细节吗?当我使用curl发送post请求时,我只能在控制台上看到类似[05/Feb/2015 08:40:39]“post/api/update_log/HTTP/1.1”500 78112这样的答案,但我看不到错误的详细信息。谢谢,请原谅我的疏忽。将
curl
的输出重定向到该文件,然后在浏览器中打开该文件<代码>卷曲。。。http://127.0.0.1:8000/api/update_log/ >错误。html
request.META['HTTP_CLIENT_NAME']