Как вернуть токен JWT после того, как пользователь создал в Django? - PullRequest
2 голосов
/ 20 января 2020

Я использую Model Serializer и хочу вернуть JWT Token после создания пользователя. Есть ли способ сделать это?
Заранее спасибо

class UserSerializer(ModelSerializer):
    """Serializers for User objects"""

    class Meta:
        model = get_user_model()
        fields = ('email', 'password')
        extra_kwargs = {'password': {'write_only': True,
                                   'min_length': 5,
                                   'style': {
                                       'input_type': 'password'
                                   }}}

    def create(self, validated_data):
        """Create a new user with encrypter password"""
        user = get_user_model().objects.create_user(**validated_data)
        return user

Ответы [ 3 ]

1 голос
/ 20 января 2020

Я достиг того, что хотел, используя код ниже. Спасибо @aman kumar. Я публикую свой собственный ответ, который относится к полной рабочей опции, которая возвращает электронную почту пользователя и токен.

class UserSerializer(ModelSerializer):
    """Serilizers for User objects"""
    token = SerializerMethodField('get_auth_token')

    class Meta:
        model = get_user_model()
        fields = ('email', 'password', 'token')
        extra_kwargs = {'password': {'write_only': True,
                                     'min_length': 5,
                                     'style': {
                                         'input_type': 'password'
                                     }}}

    def create(self, validated_data):
        """Create a new user with encrypter password"""
        user = get_user_model().objects.create_user(**validated_data)
        return user

    def get_auth_token(self, obj):
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
        payload = jwt_payload_handler(obj)
        token = jwt_encode_handler(payload)
        return token

    def update(self, instance, validated_data):
        """Update a user setting the password correctly"""
        password = validated_data.pop('password', None)
        user = super().update(instance, validated_data)

        if password:
            user.set_password(password)
            user.save()
        return user
0 голосов
/ 20 января 2020
from rest_framework_jwt.settings import api_settings

class UserSerializer(ModelSerializer):
    """Serializers for User objects"""
   auth_token = serializer.SerializerMethodField()

    class Meta:
        model = get_user_model()
        fields = ('email', 'password', 'auth_token')
        extra_kwargs = {'password': {'write_only': True,
                                   'min_length': 5,
                                   'style': {
                                       'input_type': 'password'
                                   }}}
    def get_auth_token(self, obj):
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
        payload = jwt_payload_handler(self)
        token = jwt_encode_handler(payload)
        return token

    def create(self, validated_data):
        """Create a new user with encrypter password"""
        user = get_user_model().objects.create_user(**validated_data)
        return user
0 голосов
/ 20 января 2020
from rest_framework_jwt.settings import api_settings

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
jwt_get_username_from_payload = api_settings.JWT_PAYLOAD_GET_USERNAME_HANDLER


class UserSerializer(ModelSerializer):
    """Serializers for User objects"""

    class Meta:
        model = get_user_model()
        fields = ('email', 'password')
        extra_kwargs = {'password': {'write_only': True,
                                   'min_length': 5,
                                   'style': {
                                       'input_type': 'password'
                                   }}}

    def create(self, validated_data):
        """Create a new user with encrypter password"""
        user = get_user_model().objects.create_user(**validated_data)
        return user

ОБНОВЛЕНО:

class YourViewClass:
    ...
    instance = serializer.create(serializer.validated_data)
    payload = jwt_payload_handler(instance)
    return Response({"user": instance, "token": jwt_encode_handler(payload)})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...