Https 当my permissionclass for retrieve设置为IsAuthenticated时,为什么DRF在检索请求中返回403?
我正在做一个涉及DRF的项目。我重写了standart ModelViewset上的get_permissions()方法,但检索权限似乎无法正常工作,因为我已将其设置为IsAuthenticated,但如果我发出检索请求,则会得到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
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我的代码的格式有什么问题?