2016-10-19 14 views
1

私はこれをほぼ3〜4日間手にしました。Django restフレームワークのカスタム認証クラスからカスタムレスポンスオブジェクトを返す方法

状況を説明しましょう。私は、カスタム認証クラスを持つDRF(Django REST Framework)クラスベースのビューを持っています。あなたが理解する限り、DRFのBaseAuthenticationクラスのauthenticateメソッドをオーバーライドして独自の認証を実装できますが、認証が失敗した場合はDRFから提供される事前定義された例外のみを呼び出すことができます。

私の問題は、カスタムレスポンスを返す方法を見つけることです。キャプチャHTMLを認証クラスから直接フロントエンドに送り、私の見解では認証関連のコードがないようにします。

私の状況をよりよく理解するために、私は以下の擬似コードを提供しています。

class ExampleView(APIView): 
    authentication_classes = (ExampleCustomAuth,) 

    def get(self, request): 
     pass 

これはビューであり、この部分はまったく問題ありません。

class ExampleCustomAuth(BaseAuthentication): 

    def authenticate(self, request): 
     req = request 
     request = req._request 
     { 
      This part of code decides if its required for a 
      captcha or not 
     } 

     if captcha_required: 
      response = HttpResponse() 
      response.status_code = 401 
      response['WWW-Authenticate'] = 'Captcha" id="%s"'% (id) 
      response.content = loader.render_to_string('captcha.html') 

      return response # This is where it goes wrong 

私は、ここから回答を返すことはできません。

私は誰かがこれを回避する方法を考えたことを願っています。

ありがとうございます!

答えて

0

私はついにそれを働かせる方法を考え出しました。

DRF docsによると、authenticateメソッドはすべての認証ロジックに対してオーバーライドする必要があります。また、authenticate_headerをオーバーライドする必要があるため、authenticateメソッドで例外を発生させるとauthenticate_headerメソッドから文字列を返すことができます。 www-Authenticateヘッダーの値として使用できます。

以下は実装の仕組みです。

class ExampleCustomAuth(BaseAuthentication): 

    def authenticate(self, request): 
     req = request 
     request = req._request 
     { 
      This part of code decides if its required for a 
      captcha or not 
     } 

     if captcha_required: 
      raise exceptions.AuthenticationFailed(loader.render_to_string('captcha.html')) 

    def authenticate_header(self, request): 
     return 'Captcha" id="%s"'% (id) 
関連する問題