向APIException添加自定义响应标头

时间:2013-08-15 22:02:34

标签: python django django-rest-framework

我创建了一个引用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)

你的想法?

3 个答案:

答案 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)