16

我正在尝试使用来自 drf-extensions 的批量更新。为了使其工作,有一个安全措施要求标题“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 请求上设置标头?

我什至尝试更改标题名称并将其设置为凭据

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

但我每次都会遇到同样的错误

4

4 回答 4

20

答案的文档记录极差,但似乎 django 自己解析传入的标头。我通过将代码更改为成功地做到了这一点

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和值的 HTTP 标头"true"

于 2018-10-31T14:22:19.173 回答
8

您最初的解决方案几乎是正确的;您只是缺少标题字段名称的“X”部分:

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

这对我来说适用于其他任意标题键。

于 2019-03-19T00:25:48.453 回答
7

或者你可以把它作为一个请求传递。在标题
中添加前缀很重要( ,而不是):HTTP_HTTP_MyHeaderMyHeader

response = self.client.patch(
    '/api/v1/db_items/?active=True',
    json.dumps(data),
    content_type='application/json',
    'HTTP_X_BULK_OPERATION'='true'
)
于 2020-09-16T11:19:58.507 回答
3

如果您使用 HTTP_ACCEPT(Accept header) 或 HTTP_AUTHORIZATION (AUTHORIZATION header) 等标准标头,您也可以使用这两种方式

DRF doc 推荐第一种方式,如果您想将标头应用于所有请求,请使用第一种方式

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'
    )    
于 2021-04-28T06:45:13.307 回答