Как реализовать гостевой вход в 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().

Вернуться на верх