Django REST Framework中APIClient测试时自定义请求头设置问题
问题原因
Django 测试客户端(含 DRF 的 APIClient)对请求头的传递有特定规则:直接以 X-Extserv-Signature 作为顶层关键字参数传入时,不会被识别为标准请求头存入 request.META 的对应位置,因此 request.headers 封装层无法读取到对应值。
解决方案
方法1:使用headers参数传递(推荐)
新版 DRF APIClient 支持直接传入headers字典参数,写法和正常接口调用逻辑一致,不需要修改头名称,修改后测试代码如下:
@pytest.mark.django_db def test_change_status_webhook_ok(webhook_client, status_changes): fixture_signature = ( "51b93156c361bfce14c527ddcb27cc3791e9ea6ede23bc5a56efa3be28e6a54d" ) url = reverse("webhook_v1:notification") response = webhook_client.post( url, json.dumps(status_changes), content_type="application/json", # 改动点:将自定义请求头放入headers参数 headers={"X-Extserv-Signature": fixture_signature} ) assert response.status_code == 200
修改后业务代码可直接通过request.headers.get("X-Extserv-Signature")正常读取值,和 Postman 发送的请求读取逻辑完全统一。
方法2:遵循旧版关键字参数规则
如果你使用的 DRF 版本较低不支持headers参数,可以把自定义头的名称转换为「全大写+横杠换下划线+加HTTP_前缀」的格式作为关键字参数传入:
response = webhook_client.post( url, json.dumps(status_changes), content_type="application/json", # 改动点:调整头名称格式 **{"HTTP_X_EXTSERV_SIGNATURE": fixture_signature} )
该写法同样支持通过request.headers.get("X-Extserv-Signature")正常读取值。
内容的提问来源于stack exchange,提问作者rvaldesd
相关产品推荐
相关产品推荐

