【发布时间】:2020-06-23 17:19:13
【问题描述】:
因为过去几周我的浏览器控制台中出现了一些意外的 CORS 错误,所以我在 Google Cloud Functions 中设置了一个超级简单的 Python 脚本,其中包含一个函数:
def prepData(request):
if request.method == 'OPTIONS':
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '3600'
}
return ('', 204, headers)
headers = {
'Access-Control-Allow-Origin': '*'
}
return ("", 200, headers)
它看起来与 Google 在其 documentation page 上提供的功能非常相似,但有一个主要区别:我使用的是 POST 而不是 GET。
调用该函数时,我在大约 50% 的情况下看到成功消息 (Function execution took 13 ms, finished with status code: 200),在所有其他情况下看到连接错误 (Function execution took 11 ms, finished with status: 'connection error')。每当我在 GCF 中遇到连接错误时,Chrome 的控制台都会记录一个错误:No 'Access-Control-Allow-Origin' header is present on the requested resource.
我目前正在考虑三种可能的原因:
- GCP 基础架构。我发现了一些相关问题,其中 Google 承认了一些基础架构问题。
- Python 错误
- CORS 错误(用户 sideshowbarker 说:不太可能)
问题的原因是什么,我该如何解决?
下面是调用 Python 脚本的 JS 代码:
const xhr = new XMLHttpRequest();
xhr.open("POST", "[URL]");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(stringified_serialized_data);
20 年 4 月 2 日编辑:
我发现了一种不触发错误的方法:在两个返回语句之间添加一些代码。我还没有弄清楚需要什么样的代码,但d = request.get_json() 似乎就足够了。新代码如下所示:
def prepData(request):
if request.method == 'OPTIONS':
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '3600'
}
return ('', 204, headers)
d = request.get_json() #THIS LINE IS NEW
headers = {
'Access-Control-Allow-Origin': '*'
}
return ("", 200, headers)
【问题讨论】:
-
这看起来不像云函数,它的签名类似于
def function_name(request)。您能否将您在此处部署的功能也包括在内,它也调用prepData? -
@DustinIngram 嗯,我不太明白你的意思。我目前正在使用内联编辑器 (cloud.google.com/functions/img/qs-python-console.png)。在代码输入字段下方,它显示“要执行的功能”,我在其中添加了“prepData”。我可以轻松地重命名该函数并重命名请求参数。也就是说,它已经这样工作了大约一年。
-
知道了,我认为
json_data变量名让我失望了。这个变量实际上是一个请求,而不仅仅是 JSON 数据。 -
明白,谢谢!这也解释了为什么 json_data.method 有一个值。我将对此进行调查并更改参数名称以进行澄清。但是,我认为这与上述主要问题无关。
-
您可以安全地排除 CORS 作为可能的原因。问题中显示的 CORS 配置绝不会导致连接错误。所以总的来说,CORS 与问题无关。当您收到连接错误时,浏览器记录该 CORS 消息的唯一原因是浏览器在这种情况下得到的响应没有 Access-Control-Allow-Origin 标头 - 但这是正常的和预期的。连接错误情况下的任何响应都不会有 Access-Control-Allow-Origin 标头。
标签: python google-cloud-platform xmlhttprequest google-cloud-functions