You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:27:04