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

Django测试疑难:无法捕获PermissionDenied异常求助

Django测试中assertRaises捕获PermissionDenied失败的排查要点
  • 确认异常类的正确导入
    确保你导入的是django.core.exceptions.PermissionDenied,而非其他模块的同名类。导入错误的异常类会直接导致断言匹配失败。

  • 检查assertRaises的使用方式
    必须保证请求调用被包裹在断言的捕获范围内,两种正确写法:

    1. 上下文管理器模式:
      with self.assertRaises(PermissionDenied):
          self.client.get('/scrapers/')
      
      不要在with块外提前执行请求,否则异常会直接抛出,无法被断言捕获。
    2. 函数式模式:
      self.assertRaises(PermissionDenied, self.client.get, '/scrapers/')
      
      这里要传递可调用对象self.client.get和参数,而非直接执行self.client.get()。
  • 验证raise_request_exception的生效时机
    self.client.raise_request_exception = True必须在发起请求前设置,确保客户端收到403响应时会抛出异常。如果在请求之后设置,该配置不会生效。

  • 排查视图的权限控制逻辑
    部分权限装饰器(比如@permission_required)默认返回403响应而非抛出异常,即使开启raise_request_exception也无法触发异常。这种情况下可以换用状态码断言:

    response = self.client.get('/scrapers/')
    self.assertEqual(response.status_code, 403)
    

    或者在视图中手动抛出PermissionDenied异常,替代装饰器的默认行为。

  • 检查中间件的干扰
    若存在自定义中间件处理403响应,可能会捕获异常并返回响应,导致测试无法捕获到PermissionDenied。可临时禁用自定义中间件验证是否为此原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:27:24