#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. Я обновил свой вопрос, спасибо