如何在 Django 中创建用户后 return JWT 令牌?

How to return JWT token after user created in Django?

我正在使用 Model Serializer,我想在创建用户后 return JWT 令牌。有什么办法吗?
提前致谢

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
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)})
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

我已经使用下面的代码实现了我想要的。感谢@aman kumar。 我发布了我自己的答案,它指的是 returns 用户电子邮件和令牌的完整工作选项。

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