我创建了一个引用http://django-rest-framework.org/api-guide/exceptions.html的自定义异常。
请知道我有自己的身份验证后端。因此我没有使用rest_framework的身份验证模块。
对于身份验证错误,我想将“WWW-Authenticate:Token”标头添加到从异常发送的响应中。
任何想法都会非常有用。
更新
谢谢@Pathétique, 这就是我最终做的事情。
- 有一个名为BaseView的基础视图类。
- 覆盖handle_exception方法以设置适当的标题,在我的案例中为“WWW-Authenticate”。
以下是代码:
class BaseView(APIView):
def handle_exception(self, exc):
if isinstance(exc, MYEXCEPTION):
self.headers['WWW-Authenticate'] = "Token"
return Response({'detail': exc.detail,
status=exc.status_code, exception=True)
你的想法?
答案 0 :(得分:5)
尝试在您的其余框架视图中覆盖finalize_response
:
def finalize_response(self, request, *args, **kwargs):
response = super(SomeAPIView, self).finalize_response(request, *args, **kwargs)
response['WWW-Authenticate'] = 'Token'
return response
编辑:
在看到您的更新后,我认为您的覆盖handle_exception
应该有效,我只会添加一个else语句来调用父方法来覆盖其他异常。我在覆盖调度时注意到的一件事,这可能不是问题,是为self.headers设置一个新的键/值导致服务器错误,我没有花时间追踪。无论如何,你似乎走在了正确的轨道上。
答案 1 :(得分:1)
在您的身份验证类上使用authenticate_header
方法。
此外,这将确保您的回复也设置了正确的401 Unauthorized
状态代码,而不是403 Forbidden
。
见这里:http://django-rest-framework.org/api-guide/authentication.html#custom-authentication
答案 2 :(得分:0)
您的解决方案非常正确,就我而言,我发现添加标头然后在超级实例上调用该方法更合适,以保持默认行为:
class BaseView(APIView):
def handle_exception(self, exc):
if isinstance(exc, MYEXCEPTION):
self.headers['WWW-Authenticate'] = "Token"
return super().handle_exception(excepto)