google cloud function python CORS error 请求的资源上不存在“Access-Control-Allow-Origin”标头。
Posted
技术标签:
【中文标题】google cloud function python CORS error 请求的资源上不存在“Access-Control-Allow-Origin”标头。【英文标题】:google cloud function python CORS error No 'Access-Control-Allow-Origin' header is present on the requested resource. 【发布时间】:2019-04-01 18:52:09 【问题描述】:我已按照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
从一个简单的节点应用程序,我通过调用
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”标头。 Origin 'http://localhost:4200' 因此不允许访问。
当使用 Postman 测试 POST 或 OPTIONS 时,我没有看到错误,但我也没有看到我应该看到的 HEADERS
我确定它很简单,但查看其他类似的问题和答案无法找到任何指向我的问题的东西
【问题讨论】:
我刚刚尝试复制它并且它对我有用,你确定你已经部署了你的函数的最新版本吗?当您使用curl
发送OPTIONS
请求时,您会得到什么? curl -i -X OPTIONS <your function URL>
嗨@Dustin,我使用gcloud functions deploy functionName --runtime python37 --trigger-http
进行部署,curl 返回HTTP/2 200 content-type: text/html; charset=utf-8 function-execution-id: ms2z3dcwv1tz x-cloud-trace-context: d4b120a314d0d4a2bb8b7f57d0f5baa7;o=1 date: Thu, 01 Nov 2018 07:47:38 GMT server: Google Frontend content-length: 2 alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
我也遇到了同样的问题。尝试使用curl -i -X OPTIONS <your function URL>
,我得到access-control-allow-headers: Content-Type access-control-allow-methods: POST, OPTIONS access-control-allow-origin: * access-control-max-age: 3600 content-type: text/html; charset=utf-8
只是不适用于Chrome。
【参考方案1】:
我认为这里的问题是您在 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 这样的软件不是从浏览器启动的,而是在没有任何检查的情况下提交的。
【讨论】:
还是不行,加了 'Access-Control-Allow-Methods': '*' for both【参考方案2】:您可以创建一个将 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)
然后部署 func_with_cors
gcloud 函数部署 func_with_cors --runtime python37 --trigger-http
【讨论】:
【参考方案3】:当我为函数添加注释时会发生这种情况。我添加了 this 注释,因为 Cloud Functions 没有显示 Python 的详细错误日志。当我删除注释时,我的函数返回预期的标题。
【讨论】:
以上是关于google cloud function python CORS error 请求的资源上不存在“Access-Control-Allow-Origin”标头。的主要内容,如果未能解决你的问题,请参考以下文章
具有 Google Cloud Functions 的 Google Cloud Endpoints [关闭]
从 Google Cloud Function (Python) 将新文件写入 Google Cloud Storage 存储桶
? Google Cloud Functions ?????? MongoDB Atlas ??
如何从 Cloud Functions 连接 Google Cloud SQL?
Google Cloud Platform:Cloud Functions 与 App Engine
使用 Cloud Functions for Firebase 和 @google-cloud/storage 删除图像时出现问题