2017-01-26 1 views
1

Ich fand online, dass wir ich habe url(r'^login/', ObtainJSONWebToken.as_view(serializer_class=CustomJWTSerializer)), und in Anbetracht, indem diese in unsere urlWarum überschreibt resetful JSONWebTokenSerializer nur Token zurückgeben? Python

class CustomJWTSerializer(JSONWebTokenSerializer): 

    def __init__(self, *args, **kwargs): 
     super(JSONWebTokenSerializer, self).__init__(*args, **kwargs) 

     self.fields['email'] = serializers.CharField() 
     self.fields['password'] = PasswordField(write_only=True) 

    def validate(self, attrs): 
     credentials = { 
      'username': attrs.get('email'), 
      'password': attrs.get('password') 
     } 

     print(credentials) 

     if all(credentials.values()): 
      user = authenticate(**credentials) 

      if user: 
       if not user.is_active: 
        msg = _('User account is disabled.') 
        raise serializers.ValidationError(msg) 

       payload = jwt_payload_handler(user) 

       return { 
        'token': jwt_encode_handler(payload), 
        'user': user 
       } 
      else: 
       msg = _('Unable to login with provided credentials.') 
       raise serializers.ValidationError(msg) 
     else: 
      msg = _('Must include "{username_field}" and "password".') 
      msg = msg.format(username_field=self.username_field) 
      raise serializers.ValidationError(msg) 

Damit kann ich starten Sie das Original überschreiben, aber irgendwie das Rückgabeobjekt ist immer JSONWebTokenSerializer sind in der Lage außer Kraft setzen nur das Token.

Irgendwie konnte ich nicht finden, wo es erzeugt wird, sieht es aus wie es mit diesem wegen

  return { 
       'token': jwt_encode_handler(payload), 
       'user': user 
      } 

Auch ist, Benutzer nicht nur die Token zurückgegeben wird. Ich versuchte sogar, die ganze Rückkehr herausgenommen und habe return{} aber mit dem richtigen Berechtigungsnachweis, es gibt immer noch so etwas wie {"token": null}

Ich habe sogar versucht return Response({}) verwenden, aber nach wie vor, wo es die {"token": null} davon ab, und warum ist es nicht meine user object zeigt als Antwort obwohl? Ich benutzte print (user) und sicher existiert es, dass es gültig ist

+0

Bitte schreiben Sie, was wollen Sie archivieren. – Raz

+0

@Raz Ich möchte das Benutzerobjekt nicht nur das Token zurückgeben – Dora

+0

Überschreiben von JSONWebTokenSerializer ist nicht was Sie wollen. Sie müssen Ihren eigenen Antwort-Payload-Handler verwenden. Lies @hairetdin Antwort und akzeptiere es als Lösung, denn es ist so. Ich bin nicht sicher, ob sein Code funktioniert, aber das Prinzip ist richtig. – Silko

Antwort

2

Sie können zusätzliche Einstellung verwenden - JWT_RESPONSE_PAYLOAD_HANDLER - Schlüssel und Benutzer in JSON Antwort zurückgeben. Siehe Dokumentation http://getblimp.github.io/django-rest-framework-jwt/, es gibt ein Beispiel für die Verwendung von JWT_RESPONSE_PAYLOAD_HANDLER.

Es ist mein Codebeispiel:

settings.py

JWT_AUTH = { 
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'back.views.jwt_response_payload_handler', 
} 

in Rücken/view.py

from rest_framework import serializers 
from django.contrib.auth.models import User 


class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'username') 


def jwt_response_payload_handler(token, user=None, request=None): 
    return { 
     'token': token, 
     'user': UserSerializer(user, context={'request': request}).data, 
    } 
+0

bei weitem die prägnanteste Version von dieser, die ich gefunden habe. Ich speichere diese Antwort in meinen Lesezeichen :) –

Verwandte Themen