2013-08-15 5 views
7

http://django-rest-framework.org/api-guide/exceptions.htmlを参照するカスタム例外を作成しました。カスタム応答ヘッダーをAPIExceptionに追加する

私自身の認証バックエンドがあることをご存知でしょうか。したがって、私はrest_frameworkの認証モジュールを使用していません。

認証エラーの場合、例外から送信された応答に「WWW-Authenticate:Token」ヘッダーを追加します。

非常に参考になります。

更新:悲愴、 @

おかげでこれは私がやってしまったものです。

- 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

あったのと同じ問題とあなたの提案が働いていた;) – Neara

答えて

4

はあなたの残りの部分のフレームワークビューで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ステートメントを追加すると思います他の例外をカバーする親メソッド。ここで問題にならないかもしれないディスパッチを無効にすることに気付いたことの1つは、self.headersの新しいキー/値を設定すると、追跡に時間がかからないサーバーエラーが発生したことです。とにかく、あなたは正しい軌道に乗っているようです。

+0

おかげ悲愴、更新質問を見てください。 あなたはどう思いますか? – ubhisat

+0

ああ、申し訳ありませんが、あなたのカスタム例外の重要性を逃しました...私の答えを更新します。 – Fiver

1

認証クラスでauthenticate_headerメソッドを使用します。

また、403 Forbiddenではなく、401 Unauthorizedステータスコードが正しく設定されていることを確認します。

ここを参照してください:それが必要としてhttp://django-rest-framework.org/api-guide/authentication.html#custom-authentication

+0

「私は自分の認証バックエンドを持っています」ということにもっと注意を払う必要がありました:) –

関連する問題