Django Rest 框架 API 客户端自定义 Header

Django Rest Framework API Client Custom Header

我正在尝试使用 drf-extensions 的批量更新。为了让它工作,有一个安全措施需要 header "X-BULK-OPERATION": 'true'。我可以使用 curl 或我的 angular 应用程序使应用程序正常工作,但在我的测试中我试图使用 rest_framework.test.APIClient 发送 partial_update 请求,但每次我收到 400 响应时,在调试请求时,我得到

ipdb> response.data
{'detail': "Header 'X-BULK-OPERATION' should be provided for bulk operation."}

这是我在测试中尝试使用的请求

    response = self.client.patch(
        '/api/v1/db_items/?active=True',
        json.dumps(data),
        content_type='application/json',
        **{X-BULK-OPERATION: 'true'}
    )

有没有办法在 APIClient 请求上设置 headers?

我什至尝试过更改 header 名称并使用

在凭据中设置它
self.client.credentials(HTTP_BULK_OPERATION='true')

但我每次都得到同样的错误

答案的记录非常少,但似乎 django 对传入的 header 进行了自己的解析。我通过将代码更改为

成功地做到了这一点
response = self.client.patch(
    "/api/v1/db_items/?active=True",
    json.dumps(data),
    content_type="application/json",
    HTTP_X_BULK_OPERATION="true",
)

注意 HTTP_ 前缀。这由 Django client 识别并转换为具有键 X-BULK-OPERATION 和值 "true"

的 HTTP header

您的初步解决方案几乎是正确的;您只是缺少 header 字段名称的 "X" 部分:

self.client.credentials(HTTP_X_BULK_OPERATION='true')

这对我适用于其他任意 header 键。

或者您可以将其作为请求的 kwarg 传递。
HTTP_ 前缀添加到 header 很重要(HTTP_MyHeader,而不是 MyHeader):

response = self.client.patch(
    '/api/v1/db_items/?active=True',
    json.dumps(data),
    content_type='application/json',
    'HTTP_X_BULK_OPERATION'='true'
)

如果您正在使用 标准 header 如 HTTP_ACCEPT(接受 header)或 HTTP_AUTHORIZATION(授权 header) 你也可以使用这两种方式

DRF 文档推荐第一种方式 如果您想将 header 应用于所有请求,请使用第一种方式

1-

client.credentials(HTTP_ACCEPT='application/json; version=1.0')

response = self.client.patch(
        '/api/v1/db_items/?active=True',
        json.dumps(data),
        content_type='application/json'
    )

2-

response = self.client.patch(
    '/api/v1/db_items/?active=True',
     json.dumps(data),
     content_type='application/json',
     HTTP_ACCEPT='application/json; version=1.0'
    )