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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:30:05