如何在 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
我正在使用 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