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

編集:

あなたの更新を見た後、オーバーライドが機能するはずだと思います.elsehandle_exceptionステートメントを追加して親メソッドを呼び出し、他の例外をカバーするだけです。ここでは問題にならない可能性があるディスパッチのオーバーライドで気づいたことの 1 つは、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 に答える