Skip to main content
 首页 » 编程设计

python之Django 休息框架 : Unclear error message

2024年10月01日32zdz8207

我的views.py:

class user_password(generics.UpdateAPIView): 
    authentication_classes = ([JSONWebTokenAuthentication]) 
    serializer_class = user_password_serializer 
 
    def get_queryset(self): 
        return User.objects.get(id=self.request.user.id) 

但是我在运行它时得到了这个:

AssertionError: Expected view user_password to be called with a URL keyword argument named "pk". Fix your URL conf, or set the .lookup_field attribute on the view correctly.

我知道序列化程序没问题,因为当我对同一事物使用不同类型的 View 时。它有效:

class user_password(APIView): 
 
    authentication_classes = ([JSONWebTokenAuthentication]) 
 
    def put(self, request, format=None): 
 
        serializer = user_password_serializer(data=request.data) 
        if serializer.is_valid(): 
            if request.user.check_password(serializer.validated_data[ 
                                                'old_password']): 
                request.user.set_password(serializer.validated_data[ 
                                          'new_password']) 
                request.user.save() 
 
                return Response({'success': True, 
                                'result': serializer.validated_data}, 
                                status=status.HTTP_200_OK) 
            else: 
                    return Response({'success': False, 
                                    'result': "credential mismatch"}, 
                                    status=status.HTTP_401_UNAUTHORIZED) 
 
 
        return Response({'success': False, 
                        'result': serializer.errors}, 
                        status=status.HTTP_400_BAD_REQUEST) 

我不想改变端点的构建方式。我确实有一个经过 JWT 身份验证的调用,我希望/user/password 能够简单地将“旧密码”和“新密码”放入同一个用户中。

我在 generics.UpdateAPIView 类中做错了什么? .lookup_field 它在说什么?

请您参考如下方法:

.lookup_feild 是 UpdateAPIView 期望在您的 url 模式中的字段(捕获组)(默认为 pk),例如:

r'^user/(?P<pk>\d+)/password/?$' 

但是,您应该能够覆盖 get_object而不是 get_queryset,它应该可以在不对 url 进行任何更改的情况下工作。

class user_password(generics.UpdateAPIView): 
    authentication_classes = ([JSONWebTokenAuthentication]) 
    serializer_class = user_password_serializer 
 
    def get_object(self): 
        return User.objects.get(id=self.request.user.id) 

此外,只需返回 self.request.user 就可以正常工作(我不知道 JWT 身份验证在您的项目中是如何实现的,但大多数时候 Django 会在 request.user 无论如何)。