启用 CORS Google Cloud Function (Python)

问题描述 投票:0回答:6

可以在 Google Cloud Functions 中使用您

flask_cors
吗?

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

这个

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

我尝试了很多不同的方法,正如 GCP 所建议的那样 https://cloud.google.com/functions/docs/writing/http 但我仍然收到 CORS 错误:

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

python google-cloud-platform google-cloud-functions cors flask-cors
6个回答
12
投票

不可以,

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 了解更多详细信息。


4
投票

如果您已经使用

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

4
投票

云函数中没有

APP
。您可以按照 google 云文档中所述设置 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)

2
投票

@mdev,我遇到了类似的问题,并通过在 cors_enabled_function 的开头添加预检请求的 CORS 标头来解决它(正如达斯汀·英格拉姆(Dustin Ingram)建议的那样);我留在函数末尾的主请求的 CORS 标头(这样包括返回语句中的响应,无论是 JSON、文本等)。换句话说,我将主函数代码放在预检请求和主 CORS 请求之间。


1
投票

如果您尝试从前端为您的

Post request
创建
google cloud function
并面临
CORS
的问题。以下模板必须有效。它对我有用...

#import all required packages
import json

def function_name(request):
    if request.method == 'OPTIONS':
        headers = {
            'Access-Control-Allow-Origin': '*',  # Allow your function to be called from any domain
            'Access-Control-Allow-Methods': 'POST',  # POST or any method type you need to call
            'Access-Control-Allow-Headers': 'Content-Type', 
            'Access-Control-Max-Age': '3600',
        }
        return ('', 204, headers)

    # Set CORS headers for main requests
    headers = {
        'Access-Control-Allow-Origin': '*',
    }

    # Your code logic goes here

    # Return your response
    return (json.dumps({'status': 'success'}), 200, headers)

如果您还想在预检请求后处理函数中的身份验证,请参阅此讨论:https://github.com/FirebaseExtended/reactfire/discussions/483


0
投票

在 Firebase Python Cloud Functions 中,可以这样完成:

from firebase_functions import https_fn, options

cors_settings = options.CorsOptions(cors_methods=["*"], cors_origins=["*"])

@https_fn.on_request(cors=cors_settings)
def cors_enabled_function(request):
    return https_fn.Response("cors enabled!")
© www.soinside.com 2019 - 2024. All rights reserved.