【问题标题】:Django Rest Framework API Client Custom HeaderDjango Rest Framework API 客户端自定义标头
【发布时间】:2019-04-04 01:16:39
【问题描述】:

我正在尝试使用来自 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')

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

【问题讨论】:

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


    【解决方案1】:

    答案的文档记录极差,但似乎 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 和值 "true" 的 HTTP 标头

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案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'
        )
        

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-07-11
            • 2017-01-19
            • 2018-09-29
            • 2013-11-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多