无法在 Django Rest Framework 中强制执行身份验证要求



我正在尝试强制执行身份验证以访问我的 API,但我ViewSetpermission_classes = permissions.IsAuthenticated,)属性似乎不起作用。因为我稍后尝试在get_queryset()访问用户的配置文件,所以出现以下错误:

类型错误:"匿名用户"对象不可迭代">

我还在rest_framework设置中设置了身份验证:

'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',),

在对用户配置文件执行其他业务逻辑检查之前,我还添加了调度方法:

def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return Response(status=status.HTTP_401_UNAUTHORIZED)

这也行不通:

文件 "/lib/python3.5/site-packages/rest_framework/response.py",第 57 行,rendered_content 断言渲染器,".accepted_renderer未在响应上设置" 断言错误:.accepted_renderer未在响应上设置

为什么这些身份验证控件都不起作用?

编辑:这是get_queryset()的简化版本:

kwargs = {} 
for k,v in self.request.query_params.items():
if not validate_that_key_is_an_actual_model_field(k):
return Response(status=status.HTTP_400_BAD_REQUEST)
kwargs[k] = v
return Product.objects.filter(fk_client=self.client)
.filter(**kwargs)
.order_by('uuid')
.select_related('fk_user')

事实证明,我在dispatch()中执行了一些其他事情,这些事情在调用超类的dispatch之前执行,因此在超类返回 Http401 之前访问用户配置文件。 此外,由于尚未调用超类的调度,因此渲染器尚未正确初始化(取决于请求的内容标头(,因此这是AssertionError: accepted_renderer not set on Response的来源。

最新更新