Доступ к содержимому для анонимного и зарегистрированного пользователя

Как лучше всего получить доступ к содержимому, если пользователь не вошел в систему. Например, у меня есть представление, которое обрабатывает как листинг, так и публикацию записей в блоге, но я хочу, чтобы кто-то мог получить доступ к содержимому даже без входа в систему, хотя человек не должен создавать запись в блоге, если он не вошел в систему.

Ниже приведена моя текущая реализация :

class PostList(generics.ListCreateAPIView):
    """Blog post lists"""
    queryset = Post.objects.all()
    serializer_class = serializers.PostSerializer
    authentication_classes = (JWTAuthentication,)
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, context=request)
        if serializer.is_valid():
            serializer.save()
            return response.Response(serializer.data,
                                     status=status.HTTP_201_CREATED, )
        return response.Response(serializer.errors,
                                 status=status.HTTP_400_BAD_REQUEST)

Итак, как лучше всего играть с этими линиями :

authentication_classes = (JWTAuthentication,)
permission_classes = [permissions.IsAuthenticatedOrReadOnly]

потому что когда я удаляю эту строку :

authentication_classes = (JWTAuthentication,)

Я могу получить доступ к спискам блогов, но мне нужно, чтобы конечная точка создания записей в блоге была защищена, как лучше всего этого добиться

Создайте пользовательское разрешение, наследуя класс permissions.BasePermission и переопределите метод has_permission в соответствии с вашими требованиями.

class CustomPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.method not in permissions.SAFE_METHODS\
            and not request.user.is_authenticated:
            return False
        return True

<1>> - это кортеж, содержащий методы permissions.SAFE_METHODS, GET и HEAD, которые в основном являются методами только для чтения. Поэтому если пользователь попросит создать новую запись, то будет использован метод OPTIONS, который не считается безопасным методом. А чтобы проверить, вошел ли пользователь в систему или нет, используйте POST.request.user.is_authenticated

А теперь используйте пользовательское разрешение для вашего api представления.

permission_classes = (CustomPermission,)
Вернуться на верх