Anonymous和logedIn User的访问内容



如何在用户未登录时最好地访问内容。例如,我有一个处理列表和发布博客文章的视图,尽管我希望有人在没有登录的情况下访问内容,尽管这个人不应该创建博客文章,除非登录。

下面是我当前的实现:

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."
}

虽然我需要一个创建博客文章的端点来保护,但如何才能最好地实现这一点

通过继承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&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()

相关内容

  • 没有找到相关文章

最新更新