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
相关产品推荐
相关产品推荐

