Django Rest Framework - вернуть авторизационный токен после регистрации
Я хочу вернуть авторизационный токен в json после успешной регистрации пользователя. Как я могу это сделать?
Для регистрации я использую следующее
seriazilers.py
class UserSerializer(ModelSerializer):
class Meta:
model = User
fields = [
'id',
'username',
'password',
'email',
]
write_only_fields = ('password',)
read_only_fields = ('id',)
def create(self, validated_data):
user = User.objects.create(
username=validated_data['username'],
)
user.set_password(validated_data['password'])
user.save()
return user
views.py
class CreateUser(CreateAPIView):
queryset = Profile.objects.all()
serializer_class = UserSerializer
2 ответа
Решение
Есть много способов сделать это. Вот пример в контексте вашего существующего кода.
from rest_framework.response import Response
from rest_framework.authtoken.models import Token
from rest_framework import status
class CreateUser(CreateAPIView):
queryset = Profile.objects.all()
serializer_class = UserSerializer
def create(self, request, *args, **kwargs): # <- here i forgot self
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
token, created = Token.objects.get_or_create(user=serializer.instance)
return Response({'token': token.key}, status=status.HTTP_201_CREATED, headers=headers)
Вот простое решение для пользователя, когда он / она хочет войти / войти
Прежде всего, скачайте https://github.com/GetBlimp/django-rest-framework-jwt с помощью pip
pip install djangorestframework-jwt
в вашем UserSerializer добавьте это, чтобы убедиться, что имя пользователя и пароль верны (добавьте столько полей, сколько хотите)
username = serializers.CharField(read_only=True)
password = serializers.CharField(read_only=True)
Теперь в вашем view.py добавьте это
# authenticate: will check if the user exist
from django.contrib.auth import authenticate
# api_settings: will help generating the token
from rest_framework_jwt.settings import api_settings
def login_page(request):
payload_handler = api_settings.JWT_PAYLOAD_HANDLER
encode_handler = api_settings.JWT_ENCODE_HANDLER
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
user = authenticate(username=request.data['username'], password=request.data['password'])
if user:
payload = payload_handler(user)
token = encode_handler(payload)
return Response({'token': token})
И в основном это все! Надеюсь, поможет!