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

#python #django

Вопрос:

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

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

 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,)  

Я не могу получить доступ к спискам блогов, я получаю этот ответ :

 {  "detail": "You do not have permission to perform this action." }  

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

Ответ №1:

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

 class PostsProtectOrReadOnly(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  

Это permissions.SAFE_METHODS кортеж, содержащий GET HEAD amp; OPTIONS методы, которые в основном доступны только для чтения. Таким образом, если пользователь запрашивает создание новой записи, то используемый метод будет POST методом, который не считается безопасным методом. И проверить, входит ли пользователь в систему или нет request.user.is_authenticated .

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

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

Комментарии:

1. Большое спасибо за ответ, но покроет ли это тот факт, что, если у меня не будет этой строки authentication_classes = (JWTAuthentication,) , она будет работать ? потому что, когда я его удаляю, он показывает мне этот ответ : { "detail": "You do not have permission to perform this action." }

2. Да, Вы можете использовать разрешение с. authentication_classes Это сработает.

3. Сейчас я получаю : rest_framework.request.WrappedAttributeError: 'CustomPermission' object has no attribute 'authenticate

4. можете ли вы поделиться обновленным кодом и ошибкой в своем вопросе?

5. Я обновил свой вопрос, спасибо