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'
)
我正在尝试使用 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"
您的初步解决方案几乎是正确的;您只是缺少 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'
)