Как реализовать гостевой вход в REST-фреймворке Django
В настоящее время у меня есть бэкэнд, в котором пользователи могут зарегистрироваться, указав электронную почту, имя и пароль. Эти поля обязательны для регистрации. Я хочу реализовать функцию гостевого входа, при которой учетная запись гостя удаляется при закрытии браузера или выходе гостя из системы.
Как мне создать гостевой аккаунт и какую информацию я должен включить в гостевой аккаунт (email, имя, пароль)?
Вот текущий код:
class CreateUserView(generics.CreateAPIView):
"""Create a new user in the system."""
serializer_class = UserSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.UpdateOwnProfile]
filter_backends = (filters.SearchFilter,)
search_fields = ('name', 'email',)
class UserViewSet(viewsets.ModelViewSet):
"""List all users."""
queryset = User.objects.all()
serializer_class = UserSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
class CreateTokenView(ObtainAuthToken):
"""Create a new auth token for user."""
serializer_class = AuthTokenSerializer
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
class UserLoginApiView(ObtainAuthToken):
"""Handle creating user authentication tokens."""
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
class LogoutView(APIView):
"""Logout the authenticated user."""
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
def post(self, request, *args, **kwargs):
request.user.auth_token.delete()
return Response(status=status.HTTP_200_OK)
class ManageUserView(generics.RetrieveUpdateAPIView):
"""Manage the authenticated user."""
serializer_class = UserSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
def get_object(self):
"""Retrieve and return the authenticated user."""
return self.request.user
1. Добавьте новый атрибут к вашему AUTH_USER_MODEL
для распознавания гостей:
class User(AbstractBaseUser, PermissionsMixin):
"""Database model for users in the system"""
•••Rest of code•••
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_guest = models.BooleanField(default=False)
•••Rest of code•••
2. Заведите другую View
специально для приема гостей:
class CreateGuestView(generics.CreateAPIView):
"""Create a new guest."""
serializer_class = GuestSerializer
•••Rest of code•••
3. Создайте GuestSerializer
, использованный выше:
class GuestSerializer(serializers.ModelSerializer):
"""Serializer for guests."""
•••Rest of code•••
def create(self, validated_data):
"""Create and return a user with is_guest."""
return get_user_model().objects.create_user(is_guest = True, **validated_data)
•••Rest of code•••
4. Удаление гостя при выходе из системы:
class GuestLogoutView(APIView):
"""Logout a guest and delete."""
•••Rest of code•••
def post(self, request, *args, **kwargs):
request.user.auth_token.delete()
request.user.delete()
return Response(status=status.HTTP_200_OK)
Не забудьте зарегистрировать все эти новые View
на URL. Было сделано предположение, что settings.AUTH_USER_MODEL
настроен правильно. Одна из веских причин для такого предположения - использование get_user_model()
.