使用Pytest测试DRF ChatView列表接口时出现403权限错误
问题描述
基于Django REST Framework(DRF)开发聊天功能,ChatView视图继承自GenericViewSet与ListModelMixin,包含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




