Django REST Framework实现匿名可读登录才可创建博文的配置问题
问题原因
你遇到的报错是两个配置逻辑共同导致的:
- 当你移除视图内的
authentication_classes配置时,视图会继承settings.py中配置的全局默认权限规则,如果全局默认权限为IsAuthenticated,会直接拦截所有匿名用户的请求。 - 保留
JWTAuthentication认证类本身不会拦截匿名请求:标准的JWT认证类在请求未携带有效令牌时,只会将用户标识为AnonymousUser,不会直接抛出权限异常,后续权限判断由permission_classes处理。
正确配置方案
你不需要移除authentication_classes配置,IsAuthenticatedOrReadOnly权限类本身就完全符合你的需求:GET/HEAD/OPTIONS这类读请求允许所有用户访问,POST/PUT/DELETE这类写请求仅对登录用户开放。
修正后的完整视图代码如下:
class PostList(generics.ListCreateAPIView): """Blog post lists""" queryset = Post.objects.all() serializer_class = serializers.PostSerializer # 保留JWT认证,用于识别登录用户身份,匿名请求会自动标记为AnonymousUser authentication_classes = (JWTAuthentication,) # 该权限类原生支持匿名可读、登录可写的规则 permission_classes = [permissions.IsAuthenticatedOrReadOnly] def post(self, request, *args, **kwargs): # 修正原代码中context的传参格式,需要传入字典而非直接传request对象 serializer = self.serializer_class(data=request.data, context={'request': 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)
验证规则
- 匿名用户发起GET请求可正常获取博文列表
- 匿名用户发起POST请求会返回401权限错误
- 携带有效JWT令牌的登录用户发起POST请求可正常创建博文
内容的提问来源于stack exchange,提问作者Lutaaya Huzaifah Idris
相关产品推荐
相关产品推荐

