8

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

你的意见?

4

3 回答 3

6

尝试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 设置新的键/值导致服务器错误,我没有花时间去追踪。无论如何,看来你是在正确的轨道上。

于 2013-08-16T04:41:52.333 回答
1

authenticate_header在您的身份验证类上使用该方法。

此外,这将确保您的响应也具有正确的401 Unauthorized状态代码集,而不是403 Forbidden.

见这里:http ://django-rest-framework.org/api-guide/authentication.html#custom-authentication

于 2013-08-16T12:41:27.960 回答
0

您的解决方案非常正确,在我的情况下,我发现添加标头然后在超级实例上调用该方法以保持默认行为更合适:

class BaseView(APIView):
  def handle_exception(self, exc):
     if isinstance(exc, MYEXCEPTION):
        self.headers['WWW-Authenticate'] = "Token"
        return super().handle_exception(excepto)
于 2021-01-20T15:16:28.087 回答