Доступ к содержимому для анонимного и зарегистрированного пользователя
Как лучше всего получить доступ к содержимому, если пользователь не вошел в систему. Например, у меня есть представление, которое обрабатывает как листинг, так и публикацию записей в блоге, но я хочу, чтобы кто-то мог получить доступ к содержимому даже без входа в систему, хотя человек не должен создавать запись в блоге, если он не вошел в систему.
Ниже приведена моя текущая реализация :
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,)