You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
注册

使用Pytest测试DRF ChatView列表接口时出现403权限错误

问题描述

基于Django REST Framework(DRF)开发聊天功能,ChatView视图继承自GenericViewSetListModelMixin,包含list接口及3个自定义action,采用JWT认证,默认权限类为NotBlocked

视图核心代码如下:

class ChatView(viewsets.GenericViewSet,
               mixins.ListModelMixin,
               SwaggerTag):
    queryset = Chat.objects.all()
    pagination_class = LimitOffsetPagination

    def get_queryset(self):
        with_users = Prefetch('users', queryset=User.objects.exclude(id=self.request.user.id))
        return self.request.user.chat_set.prefetch_related(with_users).all()

    # 其余视图代码省略

使用Pytest测试list接口时,通过api_client.force_authenticate(user=user1)强制认证用户,但请求/api/v1/chats/仍返回403禁止访问,错误提示为“您没有足够权限执行此操作”。测试代码如下:

@pytest.mark.django_db
def test_chatview(user1, api_client):
    api_client.force_authenticate(user=user1)
    response = api_client.get(reverse('chats-list'), format='json')
    assert response.status_code in (200, 201)

此前项目中force_authenticate配合JWT可正常工作,当前场景出现异常,需排查原因。

排查方向
  • 检查NotBlocked权限类实现:确认该权限类的has_permission方法逻辑是否正确,比如是否测试用的user1被标记为封禁状态,导致权限校验失败。
  • 确认视图权限类配置:当前视图代码未显式定义permission_classes,需检查是否通过全局配置或继承的SwaggerTag混入类设置了额外权限,导致NotBlocked未被正确应用。
  • 验证force_authenticate生效状态:在测试或视图中添加调试代码,打印request.user信息,确认用户是否被正确认证。比如在get_queryset中输出self.request.user,或在测试中打印response.data附带的用户标识。
  • 检查路由权限覆盖:查看路由注册代码,是否在注册ChatView时通过permission_classes参数覆盖了视图默认权限,比如router.register(r'chats', ChatView, permission_classes=[OtherPermission])
  • 排查认证逻辑冲突:确认项目是否修改了认证后端或添加了自定义认证中间件,导致force_authenticate设置的用户被忽略,比如某些逻辑优先从请求头获取JWT Token而非使用强制认证的用户。

内容的提问来源于stack exchange,提问作者Bte Deni

火山引擎 最新活动