Https 当my permissionclass for retrieve设置为IsAuthenticated时,为什么DRF在检索请求中返回403?

Https 当my permissionclass for retrieve设置为IsAuthenticated时,为什么DRF在检索请求中返回403?,https,django-rest-framework,http-headers,Https,Django Rest Framework,Http Headers,我正在做一个涉及DRF的项目。我重写了standart ModelViewset上的get_permissions()方法,但检索权限似乎无法正常工作,因为我已将其设置为IsAuthenticated,但如果我发出检索请求,则会得到403响应 这就是我的观点: class chartView(viewsets.ModelViewSet): queryset = chart.objects.all() serializer_class = chartSerializer

我正在做一个涉及DRF的项目。我重写了standart ModelViewset上的get_permissions()方法,但检索权限似乎无法正常工作,因为我已将其设置为IsAuthenticated,但如果我发出检索请求,则会得到403响应

这就是我的观点:

class chartView(viewsets.ModelViewSet):
    queryset = chart.objects.all()
    serializer_class = chartSerializer

    def get_permissions(self):
        if self.action == 'list'  or 'create' or 'update' or 'partial_update' or 'destroy':
            permission_classes = [IsAdminUser]
        elif self.action == 'retrieve' :
            permission_classes = [IsAuthenticated]
        return [permission() for permission in permission_classes]
在我的urls.py中,我只使用Defaultrouter()并注册如下视图:
router.register('charts',views.chartView)

当我以管理员身份登录时,列表操作通过访问:
myurl.com/api/charts
通过访问:
myurl.com/api/charts/instance

但当我以非管理员身份登录并尝试访问时:
myurl.com/api/charts/instance
我得到一个403禁止响应,这不应该发生,因为我将检索操作的权限类设置为IsAuthenticated。

我在settings.py文件中尝试了以下操作:
a:

REST_FRAMEWORK = {
  'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
    'rest_framework.permissions.IsAdminUser',
   ),
  'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.BasicAuthentication',
    'rest_framework.authentication.SessionAuthentication',
   ),
}
REST_FRAMEWORK = {
      'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
       ),
}
b:

REST_FRAMEWORK = {
  'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
    'rest_framework.permissions.IsAdminUser',
   ),
  'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.BasicAuthentication',
    'rest_framework.authentication.SessionAuthentication',
   ),
}
REST_FRAMEWORK = {
      'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
       ),
}

因为在
get\u permissions()
中有这样一个表达式

如果self.action=='list'或'create'或'update'或'partial_update'或'destroy':
权限\u类=[IsAdminUser]
它实际做的是首先处理这些字符串之间的
操作,结果直观地是
True
。因此,只有当
self.action
的值不是
False
或其他与
False
等效的值时,此表达式才会失败,但此处也不会出现这种情况,因为
self.action
将是操作方法名称的值。也就是说,此表达式始终为
True
,从而导致您的
权限\u类始终为
isadmin

您可以这样写,而不是这样做:

if self.action in('list'、'create'、'update'、'partial_update'、'destroy'):
权限\u类=[IsAdminUser]

1。请确保您的代码格式正确。2.回应内容是什么?403可能有几个原因,例如CSRF问题。您不应该使用
这样的操作。您的表达式相当于
self.action==True
,因为
True
将是该部分的逻辑运算结果。相反,您可以在('list','create',…)中使用
self.action来满足您的需求requirement@Linovia我的代码的格式有什么问题?