【问题标题】:POST fails without executing even a single linePOST 失败,甚至没有执行一行
【发布时间】:2020-11-05 10:47:38
【问题描述】:

我正在尝试从不同来源的网站发帖。我使用 JavaScript 调用 API。

显示了我所做的一个最小示例:

JavaScript

options = {method: 'POST',
      // mode: 'no-cors',
      headers: {
        'Content-Type': 'application/json'
      },
      body: formData
    }
    fetch(url, options).then(response => {
      console.log(response)
    }).catch(err => {
      console.error(err)
    });
  }

基于 Django Rest Framework 的类

class ImageUpload(APIView):

    def post(self, request, format=None):
        print("data:", request.data)
        print("file:", request.FILES)

        response = Response(status=status.HTTP_201_CREATED)
        response['Access-Control-Allow-Origin'] = "*"
        response["Access-Control-Allow-Headers"] = "*"
        print(response)
        return response

    def options(self, request, *args, **kwargs):
        response = Response()
        response['Access-Control-Allow-Origin'] = "*"
        response["Access-Control-Allow-Headers"] = "*"
        print(response)
        return response

在这个例子中,我得到了跨域请求被阻止的 CORS 错误。这是由于缺少标题。有趣的是,在调用 API 时,我的 django 控制台不会打印它在调用 POST 请求时应该打印的一行。 DRF 是如何在不进入def post 的情况下发送响应的?在调用 POST 之前,会调用 OPTIONS,它的行为完美无缺。我什至在控制台上打印了响应。

另外,另一个观察结果是,当我取消注释 mode: 'no-cors' 时,API 工作得非常好。

经过研究,我发现我可以使用django-cors-headers,但是将CORS开放给整个项目的所有视图似乎有点过头了。根据documentation of DRFthis answer 的建议,我应该正确使用标题,但如果我至少输入类中定义的post 函数,情况就会如此。

谁能指出这里发生了什么以及我哪里出错了?

【问题讨论】:

    标签: javascript django django-rest-framework cors django-cors-headers


    【解决方案1】:

    对于遇到此问题的任何人,发现 headers: {'Content-Type': 'application/json'}, 导致错误。我不知道为什么,但删除它解决了这个问题。如果有人可以尝试解释这一点,将会很有帮助:)

    【讨论】:

      猜你喜欢
      • 2013-02-24
      • 1970-01-01
      • 2012-07-25
      • 2021-07-23
      • 2015-07-24
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多