带有PUT请求的Django JWT身份验证

带有PUT请求的Django JWT身份验证,django,django-rest-framework,django-rest-auth,django-rest-framework-jwt,Django,Django Rest Framework,Django Rest Auth,Django Rest Framework Jwt,我正在尝试使用JWT令牌为用户更新first_name字段进行身份验证,由于某种原因,当我在没有用户名和密码字段的其他表中执行此操作时,我可以轻松地使用JWT令牌更新详细信息。 但是,当我在Django用户模型默认表中执行此操作时,它会不断要求我在请求中包含用户名和密码(甚至认为我不想更新它们)。下面是我在使用邮递员发送请求时遇到的错误 { "username": [ "This field is required." ], "password": [

我正在尝试使用JWT令牌为用户更新first_name字段进行身份验证,由于某种原因,当我在没有用户名和密码字段的其他表中执行此操作时,我可以轻松地使用JWT令牌更新详细信息。 但是,当我在Django用户模型默认表中执行此操作时,它会不断要求我在请求中包含用户名和密码(甚至认为我不想更新它们)。下面是我在使用邮递员发送请求时遇到的错误

{
    "username": [
        "This field is required."
    ],
    "password": [
        "This field is required."
    ]
}
尽管我正确地设置了授权头,并且它可以处理任何其他请求,但在更新用户详细信息时不会这样做,但我已经包含了所有必要的和默认的身份验证类。感谢您的帮助,4天来我们一直在努力解决这件小事

curl命令不工作

curl -H "Authorization: JWT <token>" -X PUT  http://localhost:8000/user/3/ -d '{"first_name":"curl_test"}'
我的设置.py

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',

    ),
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.JSONParser',

    )
}

JWT正在完全工作,当发送请求上的旧令牌时,我得到的签名已过期,但当我放入最新令牌时,我得到的用户名/密码是必填字段。

您的用户序列化程序正在强制执行所有字段数据,请使用
partial=True
允许:


尝试使用
patch
method相同错误。JWT说我必须包含用户名和密码,忽略发送到服务器的数据的headerAddJSON上的令牌,你想让我包含我发送的curl命令吗?一旦我的笔记本电脑完成更新,我会这样做。是的,请将其添加到您的问题中。一旦我完成更新我的笔记本电脑,我会尝试一下。我只是尝试了一下,问题不是部分更新或完全更新,我在不同的表上有相同的确切代码,其中没有用户名/密码字段,使用PUT请求可以与JWT一起使用。问题似乎在于rest框架jwt,它需要用户名和密码,即使包含令牌头。获取/验证/刷新令牌工作正常。您如何知道返回的错误来自JWT而不是
UserSerializer
?Stacktrace?
class UserDetail(APIView):
    permission_classes = (IsOwner, IsAuthenticated)
    """
    Retrieve, update or delete a user instance.
    """

    def get_object(self, pk):
        try:
            return User.objects.get(pk=pk)
        except User.DoesNotExist:
            raise Http404


    def get(self, request, pk, format=None):
        user = self.get_object(pk)
        serializer = UserSerializer(user)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        user = self.get_object(pk)
        serializer = UserSerializer(user, data=request.data)
        if serializer.is_valid():
            serializer.save()
            user = Profile.objects.get(id=pk)
            user.profile.updated = timezone.now()
            user.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        user = self.get_object(pk)
        user.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',

    ),
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.JSONParser',

    )
}
serializer = UserSerializer(user, data={'username': u'test'}, partial=True)