【问题标题】:How to allow CORS in google cloud run?如何允许谷歌云中的 CORS 运行?
【发布时间】:2020-08-04 10:08:39
【问题描述】:

我有一个反应微服务(通过 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():
...

但我仍然感到害怕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 实例对话,我非常接近!

谢谢

【问题讨论】:

  • 您能否提供一个最小的 Dockerfile / app.py 以在部署到 Cloud Run 时重现此问题?
  • 是的,当我有更多时间时,我可以尝试,希望今晚。有趣的一件事是,如果我 curl -I 使用我的资源 (backend/resources) 的后端,我确实在标头中看到了允许 cors,但我从服务器获得了 404 作为响应?
  • 404 是我的错。现在似乎 Cloud Run 正在对同一端点(http s://backend/resources -> http://backend/resources)进行永久重定向(308)

标签: flask google-cloud-platform cors google-cloud-run flask-cors


【解决方案1】:

您的设置超出了您的需要。除非需要为不同的端点提供不同的 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)

你会看到标题是存在的:

$ 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

【讨论】:

  • 是的,我在本地遇到了 CORS 问题,我最初像你提到的那样设置了 flask_cors,它在本地工作。它刚刚将它放在 Google Cloud Run 中似乎要么从标题中剥离它,要么以某种形式阻止它..
  • Cloud Run 本身不会删除此标头。是否有可能您的 nginx 配置正在删除它?
  • 检查我的答案达斯汀...我也遇到了这个问题,我在服务器端做的任何事情都没有解决它...我这边的线索(哦,mcIslee 这是要检查的东西)卷曲是否有效...但不是我的网络应用程序。因此,将我正在使用(获取)的 http 请求库切换回正常的 xhttp,这一切都开始工作了。一些糟糕的互动恰到好处。不知道这是否相同,但这就是它对我有用的原因。
【解决方案2】:

一切都是自己造成的。

正如 Dustin Ingram 所说,如果您为 Flask 启用 CORS,它将起作用。我仍然不知道为什么我会遇到 CORS 问题,我从一开始就为我的 Flask 应用启用了 CORS。

在我对所有内容都进行了核对并重新部署后,CORS 问题就消失了。但是,我最终还是得到了 404、405 和 308。

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

感谢 Dustin 和 Gabe 把时间花在我的愚蠢上。

【讨论】:

    【解决方案3】:

    我最近也在为此苦苦挣扎...我的问题是尝试使用一些 JS 库来使我的 URL 请求“更容易”,而是在请求端(而不是服务器端)修改标头。切换到直接使用 XMLHttp 并开始正常工作。我也从application/json 切换到application/x-www-form-urlencoded。我不知道这是否有所不同,但为了完整起见,将其包括在内。

    你也不应该(我说不应该,但你知道这是怎么回事)除了:

    CORS(应用程序)。所有@cross-region 的东西和配置片段都只是为了进行更窄的 CORS 访问,因此它不是完全开放的,但无论如何你在初始代码中都将它完全开放(CORS(app, resources={r"/*": {"origins": "*"}}) 与 @ 相同,我相信987654324@).

    长话短说,尝试查看请求对象,而不是 Flask 端。

    编辑:在我无法让“获取”库工作后添加对我有用的请求代码:

    var xhttp = new XMLHttpRequest();
    xhttp.open("POST", <url>, true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
    xhttp.send(Data)
    

    【讨论】:

    • 你有任何资源/链接我可以通过使请求“更容易”来了解你的意思吗?是的哈哈,我认为让 CORS 包装整个应用程序对象是最宽松的选择,但我决定把所有东西都从厨房水槽里拿出来看看它是否/什么时候可以工作。
    • 我试图使用“fetch”库。它有一个更简单的语法来发出请求,感觉很好。但无论我如何调整,我都无法让它发挥作用。我将为我使用的有效请求添加代码。
    • 前端云运行实例中的 sn-p 不再出现 CORS 错误...现在得到 404s 虽然大声笑我必须配置错误 -.-
    • 哈哈不用担心,我都明白了。在我自己发布的答案中进行了解释。
    猜你喜欢
    • 2021-05-27
    • 2020-10-03
    • 2021-08-02
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多