【发布时间】: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 DRF 和this answer 的建议,我应该正确使用标题,但如果我至少输入类中定义的post 函数,情况就会如此。
谁能指出这里发生了什么以及我哪里出错了?
【问题讨论】:
标签: javascript django django-rest-framework cors django-cors-headers