0

J'essaie de mettre à jour le champ first_name pour un utilisateur utilisant un jeton JWT pour l'authentification, pour une raison quelconque lorsque je le fais dans une autre table où il n'y a pas de champ nom d'utilisateur et mot de passe. facilement le faire et mettre à jour les détails en utilisant le jeton JWT. Mais quand je le fais dans la table par défaut du modèle utilisateur Django, il me demande toujours d'inclure le nom d'utilisateur et le mot de passe sur la requête (même si je ne veux pas les mettre à jour). voici l'erreur que je reçois lors de l'envoi de la demande à l'aide postierAuthentification Django JWT avec demande PUT

{ 
    "username": [ 
     "This field is required." 
    ], 
    "password": [ 
     "This field is required." 
    ] 
} 

même si je l'en-tête d'autorisation mis en droit et il fonctionne avec toute autre demande, mais pas lors de la mise à jour les informations utilisateur, j'ai inclus tout le nécessaire et les classes d'authentification par défaut. toute aide est appréciée, essayant de résoudre cette petite chose depuis 4 jours maintenant.

commande boucle ne fonctionne pas

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

commande curl travail

curl -H "Authorization: JWT <token>" -X GET http://localhost:8000/user/3/ 

AVIS LA méthode. mon views.py (UserDetails classe)

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) 

mon settings.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 travaille pleinement, lors de l'envoi d'un ancien jeton sur la demande que je reçois Signature a expiré, mais quand je mets le dernier jeton que j'obtiens le nom d'utilisateur/mots de passe sont des champs obligatoires.

+0

essayer d'utiliser la méthode 'patch' de –

+0

d'erreur même. JWT dit que je dois inclure le nom d'utilisateur et le mot de passe et ignorer le jeton sur l'en-tête – Abdul

+0

ajouter json des données que vous envoyez au serveur, –

Répondre

1

Votre sérialiseur utilisateur est l'application de toutes les données des champs, utilisez partial=True pour permettre partial updates:

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

Je vais essayer dès que j'aurai fini de mettre à jour mon ordinateur portable – Abdul

+0

Je viens de l'essayer, la question n'est pas mise à jour partielle ou complète, j'ai le même code exact sur une table différente où il n'y a pas de champs de nom d'utilisateur/mot de passe et l'utilisation de la requête PUT est très bien avec JWT. le problème semble être avec rest-framework-jwt il veut le nom d'utilisateur et mot de passe même si l'en-tête de jeton est inclus. Obtenir/Vérifier/Actualiser le jeton fonctionne sans problème. – Abdul

+0

Comment savez-vous que l'erreur renvoyée provient de JWT et non de UserSerializer? Trace de la pile? – vignesh