首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Google平台功能中启用CORS Python

在Google平台功能中启用CORS Python
EN

Stack Overflow用户
提问于 2020-12-14 17:30:15
回答 1查看 400关注 0票数 1

我阅读了几篇媒体文章以及Google自己的教程,但仍然无法在此功能上使用烧瓶启用CORS :(

我缺少什么代码来启用CORS?我想要*的通配符,因为我希望所有服务/域都能够访问这个函数和其他函数。

我听说GCP不适合@app。为什么,我不太确定。

注意,我已经成功地直接在浏览器的url栏上测试了输出,并触发了GCP本身内的JSON测试。

我的目的是只用于GET请求。

代码语言:javascript
复制
from flask import Flask
import re

def hello_method(request):
    from flask import abort

    if request.method == 'GET':
        
        headers = {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'GET',
            'Access-Control-Allow-Headers': 'Content-Type',
            'Access-Control-Max-Age': '3600'
        }

        request_json = request.get_json()
        pattern = re.compile("([0-9]+(\.[0-9]+)?)")
        
        if request.args and 'x' and 'y' in request.args:
            x_str = request.args.get('x')
            y_str = request.args.get('y')

            if not (pattern.match(x_str)):
                rtn = "{\"error\":true,\"string\":" + "NaN" + "*" + y_str + "=" + "NaN" + ",\"answer\":" + "NaN" +"}"
                return (rtn, 204, headers)
            if not (pattern.match(y_str)):
                rtn = "{\"error\":true,\"string\":" + x_str + "*" + "NaN" + "=" + "NaN" + ",\"answer\":" + "NaN" +"}"
                return (rtn, 204, headers)

            x = float(x_str)
            y = float(y_str)
            print("Args X: " + str(x))
            print("Args Y: " + str(y))
            ans = x * y
            print("Args Answer: " + str(ans))
            rtn = "{\"error\":false,\"string\":" + str(x) + "*" + str(y) + "=" + str(ans) + ",\"answer\":" + str(ans) +"}"
            return (rtn, 204, headers)
        elif request_json and 'x' and 'y' in request_json:
            x_str = request.args.get('x')
            y_str = request.args.get('y')

            if not (pattern.match(x_str)):
                rtn = "{\"error\":true,\"string\":" + "NaN" + "*" + y_str + "=" + "NaN" + ",\"answer\":" + "NaN" +"}"
                return (rtn, 204, headers)
            if not (pattern.match(y_str)):
                rtn = "{\"error\":true,\"string\":" + x_str + "*" + "NaN" + "=" + "NaN" + ",\"answer\":" + "NaN" +"}"
                return (rtn, 204, headers)

            print("JSON: ", request_json)
            x = float(request_json['x'])
            y = float(request_json['y'])
            print("JSON X: ", str(x)) 
            print("JSON Y: ", str(y))
            ans = x * y
            print("JSON Answer 2: " + str(ans))
            rtn = "{\"error\":false,\"string\":" + str(x) + "*" + str(y) + "=" + str(ans) + ",\"answer\":" + str(ans) +"}"
            return (rtn, 204, headers)
        else:
            return f"Please pass 2 variables x and y as http"

    elif request.method == 'PUT':
        return abort(403)
    else:
        return abort(405)

我似乎知道CORS的理论,但我的实践还不够强,GCP似乎与烧瓶不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-15 11:15:25

首先,不要用水瓶。每个函数都是一个动作,云函数已经负责请求路由和框架处理。

至于CORS问题,云函数文档中有关于如何处理CORS的示例。

在更新的代码中,您将拒绝PUT请求,并在GET方法而不是instead方法上返回CORS头。这不是上面链接的文档所做的,请仔细检查。云函数的架构应该类似于:

代码语言:javascript
复制
def the_function(request):
    # Return CORS headers on OPTIONS request.
    if request.method == 'OPTIONS':
        headers = {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'GET',
            'Access-Control-Allow-Headers': 'Content-Type',
            'Access-Control-Max-Age': '3600'
        }
        return ('', 204, headers)
    
    # If the request is GET then handle it normally
    if request.method == 'GET':
        x = request.args('x')
        y = request.args('x')
        result = int(x) * int(y)
        headers = {
            'Access-Control-Allow-Origin': '*'
        }
        return (result, 200, headers)
     else:
        # If the request is not GET or OPTIONS, deny.
        return '', 400

据我所知,您只希望允许GET请求到函数。但是,必须允许选项HTTP方法使CORS正常工作。当一个网页向另一个域请求内容时,浏览器可能会向目标域发送一个飞行前请求(在本例中是云函数),询问实际的GET/POST/等等。请求将被允许。为了实现这一点,会向服务器发送选项请求,并且服务器必须响应确认允许的HTTP方法。因此,要使该职能按预期工作,就必须:

  1. 在OPTIONS方法上返回Access-Control-Allow-XXX头。
  2. 接受任何其他方法返回的实际响应,在本例中获取。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65293649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档