6

可以flask_cors在 Google Cloud Functions 中使用您吗?

app = Flask(__name__)
cors = CORS(app)

这个包在本地flask_cors可以工作,但在部署到 Cloud Functions 上时却不行。

我尝试了许多不同的方法,因为 GCP 建议https://cloud.google.com/functions/docs/writing/http 但我仍然收到 CORS 错误:

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

4

4 回答 4

7

不,该app变量在 Cloud Functions 中不可用。

相反,您可以手动处理 CORS:

def cors_enabled_function(request):
    # For more information about CORS and CORS preflight requests, see
    # https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request
    # for more information.

    # 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 = {
        'Access-Control-Allow-Origin': '*'
    }

    return ('Hello World!', 200, headers)

有关更多详细信息,请参阅https://cloud.google.com/functions/docs/writing/http#handling_cors_requests

于 2020-09-25T21:59:16.650 回答
2

如果您已经在使用flask,那么最简单的方法是使用flask-cors

https://github.com/corydolphin/flask-cors

像下面这样装饰你的云功能,你就完成了。

from flask_cors import cross_origin

@cross_origin()
@json
def fun_function(request):
    # enter code here

或者,您可以根据需要添加尽可能多的功能,如下所示。

from flask_cors import cross_origin

@cross_origin(allowed_methods=['POST'])
@json
def fun_function(request):
    # enter code here
于 2021-03-24T17:50:49.987 回答
1

云功能中没有APP您可以按照谷歌云文档中的说明设置 CORS 标头,并按照您在 Flask 中编写的方式返回您的 JSON。

下面的示例调用hello_world了用于发布请求的函数。它返回CORS.

from flask import jsonify

def hello_world(request):
    request_json = request.get_json()
    # 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': 'POST',
            'Access-Control-Allow-Headers': 'Content-Type',
            'Access-Control-Max-Age': '3600'
        }

        return ('', 204, headers)

    # Set CORS headers for the main request
    headers = {
        'Access-Control-Allow-Methods': 'POST',
        'Access-Control-Allow-Origin': '*'
    }

   if request_json and 'labels' in request_json:
        # THIS IS THE PLACE YOU WRITE YOUR CODE.
        # AWLAYS RETURN WITH THE HEADERS AND STATUS
        return (jsonify({"ok": "Great Day 2"}), 200, headers)
于 2021-06-11T08:18:26.320 回答
1

@mdev,我有一个类似的问题,并通过在我的 cors_enabled_function 开头添加预检请求的 CORS 标头来解决它(正如 Dustin Ingram 建议的那样);我在函数结束时留下的主要请求的 CORS 标头(这种方式包括返回语句中的响应,可以是 JSON、文本等)。换句话说,我将我的主要功能代码放在预检和主要 CORS 请求之间。

于 2021-03-16T10:44:40.227 回答