django 获取authentication_classes的错误”列表对象不可调用

gt0wga4j  于 2023-02-20  发布在  Go
关注(0)|答案(1)|浏览(130)

我有以下方法:

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错误。我希望它能工作,因为我们可以在这里看到类似的代码:12 . Django文档也在这里声明了。
是因为它们与基于函数的视图一起使用,而不允许与视图集一起使用吗?我在这里遗漏了什么?

附言

我的settings.py确实指定了TokenAuthentication

REST_FRAMEWORK = {

    # ...

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ),

    # ...
}

**PS2:**我还尝试了以下操作,尽管它与错误有点无关:

@authentication_classes((TokenAuthentication))

以及

@authentication_classes((TokenAuthentication,))
jgovgodb

jgovgodb1#

医生说:
您还可以使用APIView基于类的视图,在每个视图或每个视图集的基础上设置身份验证方案。

authentication_classes = [SessionAuthentication, BasicAuthentication]

所以我把它添加为类变量:

class AbcViewSet(viwesets.ModelViewSet):

    authentication_classes = [TokenAuthentication, SessionAuthentication]  # <<=====

    @action(detail=False, permission_classes=(IsOwnerOrReadOnly,))
    @debugger_queries
    def get_xyz(self, request, pk=None):
        # ...

错误就消失了。
我不应该在视图集中使用@authentication_classes装饰器,而是在类中定义authentication_classes变量,这是我缺乏的知识。

相关问题