如何让CORS在谷歌云中运行?

mcl*_*lee 7 cors flask google-cloud-platform flask-cors google-cloud-run

我有一个 React 微服务(通过 nginx)部署到谷歌云运行上,其后端环境变量设置为另一个运行为后端服务的 Gunicorn 的谷歌云运行实例。

我的 Flask 应用程序是按照我能找到的有关允许 CORS 的所有内容进行设置的:

app = Flask(__name__)
app.config.from_object(config)
CORS(app, resources={r"/*": {"origins": "*"}})
app.config['CORS_HEADERS'] = 'Content-Type'
return app

# Different file, a blueprint's urls:

@blueprint.route('/resources')
@cross_origin()
def get_resources():
...

Run Code Online (Sandbox Code Playgroud)

但我仍然感到害怕Access to XMLHttpRequest at 'https://backend/resources/' from origin 'https://frontend' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

有谁对此有任何见解/知道在解决这个问题时还可以从哪里寻找?我想用我的微服务设置 GKE,但最初选择了阻力最小的路径,在云中建立 POC。我让后端与我的 Cloud SQL 实例对话,我已经很接近了!

谢谢

Dus*_*ram 6

您设置的内容超出了您的需要。除非您需要为不同的端点提供不同的 CORS 访问权限,否则最简单的示例只需要调用CORS(app)

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route("/resources")
def get_resources():
  return "Hello, cross-origin-world!"

if __name__ == "__main__":
    app.run('0.0.0.0', 8080, debug=True)
Run Code Online (Sandbox Code Playgroud)

你会看到标题存在:

$ curl -I localhost:8080/resources
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 26
Access-Control-Allow-Origin: *
Server: Werkzeug/1.0.1 Python/3.7.4
Date: Tue, 21 Apr 2020 17:19:25 GMT
Run Code Online (Sandbox Code Playgroud)


mcl*_*lee 5

一切都是自作自受。

正如达斯汀·英格拉姆(Dustin Ingram)提到的,如果为 Flask 启用 CORS,它就会起作用。我仍然不知道为什么我会遇到 CORS 问题,我从一开始就为我的 Flask 应用程序启用了 CORS。

在我清理所有内容并重新部署后,CORS 问题就消失了。然而,我最终还是得到了 404、405 和 308。

有几个问题,我所有的缺点,综合起来给我带来了这些问题。在create-react-app(我认为webpack正在这样做)中,传递到docker运行时的环境变量没有得到尊重,因此我在Cloud Run中设置的环境变量根本不起作用。目前我选择了 process.env.VARIABLE || “硬编码 URL”路线。一旦我弄清楚了这一点,我还记得 Flask URL 中的尾部斜杠是不好的......这给了我 308,永久重定向。一旦弄清楚这一点,我意识到在手动部署期间,我没有将云构建映像切换到最新版本。叹。一旦我开始部署最新的映像,一切就开始工作了。耶!

感谢达斯汀和加布花时间研究我的愚蠢行为。