2017-10-12 69 views
1

我在基於django-rest-framework的應用程序中執行(或多或少)自定義身份驗證,我只需要調用另一個微服務來詢問它是否有效和什麼用戶名/用戶名與它相關聯。 (我沒有用戶的本地表)。Django-rest-framework:return來自.dispatch的響應

找到沒有開箱即用的解決方案後,我重寫了dispatch方法(我使用的是基於APIView的視圖),在此我向遠程服務發出請求,並且如果響應不是200 ,我想返回一個403錯誤。

這裏是我的代碼:

def dispatch(self, request, *args, **kwargs): 
    try: 
     user_info = user_from_token_in_request(request) 
     return super().dispatch(*args, **kwargs) 
    except: 
     return Response(
      "No Auth Token provided or bad Auth Token" 
      status.HTTP_403_FORBIDDEN, 
     ) 

然而,當我通過一個無效的令牌,我得到這個錯誤:AssertionError: .accepted_renderer not set on Response,因爲當處理dispatch方法的響應上下文未初始化。

有沒有一種更正確的方法來做到這一點?

回答

2

而不是返回Response嘗試引發DRF提供的例外之一,其異常處理程序會自動處理其餘的。

from rest_framework.exceptions import PermissionDenied 

def dispatch(self, request, *args, **kwargs): 
    try: 
     # ... 
    except: 
     raise PermissionDenied("NO Auth Token provided") 

這樣說,不建議在您的視圖本身編寫驗證碼。您應該在自定義認證/權限類中完成此操作。

from rest_framework.authentication import BaseAuthentication 

class MyAuthentication(BaseAuthentication): 
    def authenticate(self, request): 
     try: 
      user_info = user_from_token_in_request(request) 
     except: 
      raise AuthenticationFailed('No auth token provided') 

class MyApiView(APIView): 
    authentication_classes = [MyAuthentication] 

另外,還要確保你已經在你的休息框架設置中定義EXCEPTION_HANDLER

REST_FRAMEWORK = { 
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler' 
} 
+0

在這種情況下,客戶得到的響應是500 – Ibolit

+0

@Ibolit有你在設置中定義的REST框架異常處理程序。 – hspandher

+0

我也嘗試過實現.handle_exception,但它不會在調度中調用異常。 – Ibolit