【问题标题】:Google Cloud Run - how to set 'Access-Control-Allow-Origin' header?Google Cloud Run - 如何设置“Access-Control-Allow-Origin”标头?
【发布时间】:2019-09-10 13:12:31
【问题描述】:

我正在 Google Cloud Run 上设置我的第一个应用程序,现在想将服务器连接到我的网站。但是我遇到了 CORS 问题。

我尝试使用 flask_cors 在我的代码中修复它。我可以在来自 localhost 的请求中看到它们确实包含 CORS 标头,但它不来自 Cloud Run。

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})

我还尝试在后台使用的存储桶上设置 CORS。使用以下代码

gsutil cors set cors-json-file.json gs://

链接:https://cloud.google.com/storage/docs/configuring-cors

我希望在某处找到有关如何在 Cloud Run 上设置 CORS 的说明,但找不到任何说明。我尝试让我的容器/API 支持 CORS,但是当我将它推送到 Cloud Run 时,它“消失了”。

我们将不胜感激!

【问题讨论】:

  • 您的意思是当您将 flask_cors 应用推送到 Cloud Run 并向 Cloud Run 服务发送 OPTION 请求时,响应中缺少 CORS 标头?
  • 我不知道为什么 GCS 在这里是相关的。如果您需要将 GCS 存储桶用作网站,则无需 Cloud Run 即可。
  • 在向 Cloud Run 发出请求时,您能否分享 curl 或您用于检查标头的任何应用程序的输出?

标签: python flask google-cloud-run


【解决方案1】:

我已经按照您的描述编辑了 Cloud Run python 示例

import os
from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})

@app.route('/')
def hello_world():
    return 'Hello, world!\n'

if __name__ == "__main__":
    app.run(debug=True,host='0.0.0.0',port=int(os.environ.get('PORT', 8080)))

我能够在 Cloud Run 上本地和远程获取 access-control-allow-origin: * 标头。

docker run --rm -i -e PORT=8080 -p 8080:8080 gcr.io/ahmetb-samples-playground/run/cors-test
$ curl -v http://localhost:8080
< HTTP/1.1 200 OK
< Server: gunicorn/19.9.0
< Date: Mon, 22 Apr 2019 18:23:06 GMT
< Connection: keep-alive
< Content-Type: text/html; charset=utf-8
< Content-Length: 14
< Access-Control-Allow-Origin: *

云跑:

$ curl -v https://cors-test-dpyb4duzqq-uc.a.run.app
< HTTP/2 200
< content-type: text/html; charset=utf-8
< access-control-allow-origin: *
< x-cloud-trace-context: 8503b029795fdc57bbc4267961806847;o=1
< date: Mon, 22 Apr 2019 18:23:30 GMT
< server: Google Frontend
< content-length: 14

两个响应都带有您的应用程序中设置的access-control-allow-origin 标头。 Cloud Run 不会删除此标头。

我不确定 GCS CORS 权限如何/为何与此问题相关。如果您想直接从 GCS Buckets 为网站提供服务,请阅读Hosting a static Website on GCS

如果您只是将请求从 Cloud Run 代理到 GCS,是的,它可能会从 GCS 响应中继承 CORS 标头。我建议您检查这些标题。

【讨论】:

  • 我可以支持这个,我也无法重现“缺少标题”的行为。也许OP的问题是Access-Control-Allow-Originaccess-control-allow-origin的大小写之间的区别?
  • 是的,它们是同一个标题,不应区别对待。
  • @AhmetB-Google 感谢您的回答。作为一名数据科学家,我的网络开发技能有限。在我在每个端点上方添加它之后,它就像一个魅力(我不知道为什么)。 @cross_origin(origin=['localhost'], headers=['Content-Type','Authorization'])
  • 另外,也许我应该注意,我并没有尝试托管网站,而是实际运行机器学习模型。 (它非常小,所以我不需要它很快)。所以我试图将它用作 FaaS,但更聪明(这是我希望它的用途)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 2018-01-24
  • 2016-01-11
  • 2014-06-09
  • 1970-01-01
  • 2021-09-15
相关资源
最近更新 更多