如何在用户未登录时最好地访问内容。例如,我有一个处理列表和发布博客文章的视图,尽管我希望有人在没有登录的情况下访问内容,尽管这个人不应该创建博客文章,除非登录。
下面是我当前的实现:
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()