Django request.META不包含标头
我将djangorestframework与以下代码一起使用:Django request.META不包含标头,django,django-rest-framework,Django,Django Rest Framework,我将djangorestframework与以下代码一起使用: class RegistrationView(APIView): def post(self, request, format=None): print self.request.META.get('API_KEY') 并且它返回None(其他标题,如Content-Type或User-Agent都可以) 但是这个头肯定存在于请求中(这个键只是本地数据库,所以可以将它粘贴到这里): 为什么?任何自定义头在MET
class RegistrationView(APIView):
def post(self, request, format=None):
print self.request.META.get('API_KEY')
并且它返回None
(其他标题,如Content-Type
或User-Agent
都可以)
但是这个头肯定存在于请求中(这个键只是本地数据库,所以可以将它粘贴到这里):
为什么?任何自定义头在META中都带有
HTTP
关键字
因此,您可以尝试访问标题,如
request.META.get('HTTP_API_KEY')
有时,预处理框架(如Varnish for caching)被设置为丢弃在请求中找到的任何自定义头。可能在您的服务器上执行类似的操作?因为您同时使用基于令牌和基于会话的身份验证。我假定您正在通过浏览器进行测试,在这种情况下,您正在使用会话进行身份验证,您实际上可以从cookie中获取会话,然后反向选择用户并从中选择令牌
尽管如此,请尝试使用Curl或任何REST客户机进行测试。打印出
request.META
-第一个键是HTTP\u AUTHORIZATION
问题在于请求头中的下划线
将标题设置为API-KEY(使用连字符,而不是下划线),可以使用
request.headers.get('HTTP_API_KEY')
这种行为的原因是某些服务器忽略下划线
看这个相关的问题
在Django的旧版本上:
request.META.get('HTTP\u-API\u-KEY')
这是本地开发服务器(嵌入Django中)。这是我遇到的一些最古怪的行为。。。无提示地忽略标题,没有任何解释或警告。