我按照https://cloud.google.com/functions/docs/writing/http#functions_http_cors-python
所以我的代码在最后有这个
# Set CORS headers for the preflight request
if request.method == 'OPTIONS':
# Allows GET requests from any origin with the Content-Type
# header and caches preflight response for an 3600s
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '3600'
}
return ('', 204, headers)
# Set CORS headers for the main request
headers = {
'Content-Type':'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type',
}
# END CORS
return (res, 200, headers)
其中res是JSON
从一个简单的节点应用程序,im通过调用
this.http.post(payloadTarget.url, JSON.stringify(clone)).subscribe(res => {
console.log('request complete', res);
},
err => {
console.log('request failed', err);
});
我在控制台上收到这个错误
请求的资源上不存在"Access Control Allow Origin"标头。原点'http://localhost:4200因此不允许访问。
当使用Postman测试POST或OPTIONS时,我没有看到错误,但我也没有看到应该的HEADERS
我相信这很简单,但看看其他类似的问题和答案,找不到任何指向我的问题的东西
我认为这里的问题是您在OPTIONS响应中遗漏了POST
。使用CORS,您需要明确哪些http方法是可以接受的。话虽如此,您需要将飞行前请求更新为:
# Set CORS headers for the preflight request
if request.method == 'OPTIONS':
# Allows GET requests from any origin with the Content-Type
# header and caches preflight response for an 3600s
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '3600'
}
return ('', 204, headers)
# Set CORS headers for the main request
headers = {
'Content-Type':'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type',
}
# END CORS
return (res, 200, headers)
或者,您可以将值设置为:
'Access-Control-Allow-Methods': '*'
如果你不那么关心安全。
此外,您没有通过POSTMAN收到这些错误的原因是由于请求的性质-所有现代浏览器都会拦截您的请求,并检查来源是否匹配(域、端口、协议等(,如果不匹配,则会向目的地发出飞行前(OPTIONS
(请求,以确保其正常。像POSTMAN这样的网站和像Fiddler这样的软件不是从浏览器启动的,并且是在没有任何检查的情况下提交的。
您可以创建一个函数,将CORS添加到每个响应中。使用jsonify将dict强制转换为JSON。
from flask import jsonify
def addCors(response, code=200):
headers = {'Access-Control-Allow-Origin': '*'}
return (response, code, headers)
def func_with_cors(request):
response = jsonify({"key1":"value1","key2":"value2"})
return addCors(response)
然后部署函数with_cors
gcloud函数部署func_with_cors--运行时python37--触发http
当我为函数添加注释时,就会发生这种情况。我添加这个注释是因为Cloud Functions没有显示Python的详细错误日志。我的函数在删除注释时返回预期的标头。