gpt4 book ai didi

Django-rest-framework:从 .dispatch 返回响应

转载 作者:行者123 更新时间:2023-12-01 01:24:42 25 4
gpt4 key购买 nike

我正在 django-rest-framework 中进行(或多或少)自定义身份验证基于应用程序,我只需要调用另一个微服务来询问 token 是否有效以及与之关联的用户名/用户 ID。 (我没有供用户使用的本地表)。

没有找到开箱即用的解决方案,我覆盖了 dispatch方法(我使用的是基于 APIView 的 View ),我向远程服务发出请求,如果响应不是 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,
)

但是,当我传递无效 token 时,我收到此错误: AssertionError: .accepted_renderer not set on Response ,因为响应上下文在 dispatch 时未初始化方法进行处理。

有没有一种更合适的方法呢?

最佳答案

而不是返回 Response尝试引发 DRF 提供的异常之一,其异常处理程序将自动处理其余部分。

from rest_framework.exceptions import PermissionDenied

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

话虽如此,不建议在您的 View 本身中编写您的身份验证代码。您应该在自定义身份验证/权限类中完成此操作。
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'
}

关于Django-rest-framework:从 .dispatch 返回响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46713047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com