我有以下方法:
class AbcViewSet(viwesets.ModelViewSet):
@action(detail=False, permission_classes=(IsOwnerOrReadOnly,))
@debugger_queries
def get_xyz(self, request, pk=None):
# ...
在这个方法中,request.user
总是AnonymousUser
。我觉得这是因为我没有为这个方法指定任何类型的身份验证。我跳过了代码库,发现其他开发人员使用装饰器。所以,我尝试添加一个装饰器@authentication_classes([TokenAuthentication,])
,如下所示:
class AbcViewSet(viwesets.ModelViewSet):
@action(detail=False, permission_classes=(IsOwnerOrReadOnly,))
@debugger_queries
@authentication_classes([TokenAuthentication,])
def get_xyz(self, request, pk=None):
# ...
但是它开始给我这个新添加的行'list' object is not callable
错误。我希望它能工作,因为我们可以在这里看到类似的代码:1,2 . Django文档也在这里声明了。
是因为它们与基于函数的视图一起使用,而不允许与视图集一起使用吗?我在这里遗漏了什么?
附言:
我的settings.py确实指定了TokenAuthentication
:
REST_FRAMEWORK = {
# ...
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
),
# ...
}
**PS2:**我还尝试了以下操作,尽管它与错误有点无关:
@authentication_classes((TokenAuthentication))
以及
@authentication_classes((TokenAuthentication,))
1条答案
按热度按时间jgovgodb1#
医生说:
您还可以使用
APIView
基于类的视图,在每个视图或每个视图集的基础上设置身份验证方案。所以我把它添加为类变量:
错误就消失了。
我不应该在视图集中使用
@authentication_classes
装饰器,而是在类中定义authentication_classes
变量,这是我缺乏的知识。