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

Django pytest接口用例返回403但Postman请求正常是什么原因?

Django REST framework pytest测试403问题解决方案

核心问题点

  • Django测试客户端传递自定义请求头时,要求header键名必须添加HTTP_前缀,你代码中直接传入Authorization键的headers无法被测试客户端识别,后端拿不到token就会返回403。
  • Authorization值的前缀需要和后端DRF认证配置完全匹配:你curl示例中用的是小写token 前缀,代码中用的是大写Token 前缀,大小写不匹配也会触发认证失败。
  • 低于3.2版本的Django测试客户端不支持headers参数,需要直接将带HTTP_前缀的header作为关键字参数传入请求方法。

修正后的测试代码

def test_get_signal(client):
    form_data = {
        "username": "testuser",
        "password": "mytestpassword",
    }
    CustomUser.objects.create_user(**form_data)
    # 登录请求
    response = client.post("/accounts/login/", form_data, follow=True)
    assert response.status_code == 200
    response_content = json.loads(response.content)
    token = response_content["access_token"]
    
    # 携带token发起接口请求
    response = client.get(
        path="/api/v1/signals/",
        # 注意这里添加了HTTP_前缀,前缀Token/token和你后端配置保持一致即可
        HTTP_AUTHORIZATION=f"Token {token}",
        content_type="application/json",
    )

    assert response.status_code == 200

如果你使用的是Django 3.2及以上版本,也可以保留headers传参方式,只要保证键名正确即可。

额外验证点

如果你后端使用的是simplejwt等JWT认证组件,默认的Authorization前缀是Bearer而非Token,可以先和后端认证配置核对前缀规则,确保和请求中传入的前缀完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:06:03