Django Rest Framework API客户端自定义标头

时间:2018-10-30 22:28:15

标签: django-rest-framework django-tests drf-extensions

我正在尝试使用drf-extensions的批量更新。为了使其正常工作,有一个保护措施,要求标题为“ X-BULK-OPERATION”:“ true”。我可以使用curl或我的有角度的应用程序使该应用程序正常工作,但是在测试中,我尝试使用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 个答案:

答案 0 :(得分:3)

或者您也可以将其作为请求的 kwarg 传递。
重要的是在标题中添加HTTP_前缀(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'
)

答案 1 :(得分:1)

答案的文献记载极少,但是django似乎对传入的标头进行了自己的解析。我通过将代码更改为

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

答案 2 :(得分:0)

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

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

这与其他任意标题键一起为我工作。

答案 3 :(得分:0)

如果您使用 标准标头,如 HTTP_ACCEPT(接受标头)或 HTTP_AUTHORIZATION(AUTHORIZATION 标头) 你也可以用这两种方式

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

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'
    )