标题叫:‘ 授权 </跨度> ’在我发送的请求中。
问题是在我的单元测试中,身份验证失败了。查看TokenAuthentication类,我看到正在检查的标题是’HTTP_AUTHORIZATION’而不是’ 授权 </跨度> “
我正在使用的视图:
class DeviceCreate(generics.CreateAPIView): model =设备 serializer_class = DeviceSerializer
authentication_classes
汤姆的回答 很好,但不完整。
您的代码可以在开发环境中正常工作(使用 runserver )但是如果你在WSGI服务器(在我的情况下是Apache)中尝试它,服务器可以删除Authorization标头!
runserver
你可以找到 布恩的博客 一个很好的修复Apache conf以保持请求中的Authorization标头并使其工作得很好:
RewriteEngine on RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
查看TokenAuthentication类,我看到正在检查的标头是'HTTP_AUTHORIZATION'而不是'授权'
在请求中进行查找时并不完全正确 META dict,它实际上正在寻找的标题没有前面的 HTTP_ 所以 request.META.get('HTTP_AUTHORIZATION', '') 是 实际上查找了 Authorization 请求中的标头。
META
HTTP_
request.META.get('HTTP_AUTHORIZATION', '')
Authorization
问题是在我的单元测试中,身份验证失败了 将标题更改为“HTTP_AUTHORIZATION”似乎有效
我没有仔细检查测试客户端的外观,但我相信设置 HTTP_AUTHORIZATION 你需要做的就是获得相当于实际设置的东西 Authorization 头。如果您实际发出了http请求,您会发现设置auth标头的工作方式完全符合您的预期。
HTTP_AUTHORIZATION
看到 request.META 文档在这里: https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META
request.META
的 编辑 强> :
Django在查找标题时提供文档 request.META :
除了上面给出的CONTENT_LENGTH和CONTENT_TYPE之外, 请求中的任何HTTP标头都将转换为META密钥 将所有字符转换为大写,用。替换任何连字符 下划线并在名称中添加HTTP_前缀。所以,例如,a 称为X-Bender的标头将映射到META密钥HTTP_X_BENDER。
Django有关使用测试客户端设置标头的文档:
但是,您可以使用关键字参数来指定一些默认标头。例如,这将发送一个 User-Agent 每个请求中的HTTP标头: c =客户端(HTTP_USER_AGENT ='Mozilla / 5.0')
但是,您可以使用关键字参数来指定一些默认标头。例如,这将发送一个 User-Agent 每个请求中的HTTP标头:
User-Agent
c =客户端(HTTP_USER_AGENT ='Mozilla / 5.0')