2017-10-12 71 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