在 Google 云平台功能中启用 CORS Python
Enabling CORS Python in Google Cloud Platform Function
我已经关注了一些 Medium 文章以及 Google 自己的教程,但仍然无法在这个函数上使用 flask 启用 CORS :(
我缺少什么代码来启用 CORS?我想要 * 通配符,因为我希望所有服务/域都能够访问此功能和其他功能。
我听说 GCP 不能很好地与@app 配合使用。为什么,我不太确定。
请注意,我已经成功地直接在浏览器的 url 栏上测试了输出,并在 GCP 本身内触发了 JSON 测试。
我的预期用途仅用于 GET 请求。
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 似乎与 flask-cors 的工作方式不同。
首先,不要使用 Flask。每个函数都旨在成为一个单独的操作,而 Cloud Functions 已经负责请求路由和框架处理。
至于 CORS 问题,Cloud Functions documentation 中提供了有关如何处理 CORS 的示例。
在更新的代码中,您拒绝 PUT 请求并在 GET 方法而不是 OPTIONS 方法中返回 CORS headers。这不是上面链接的文档所做的,请仔细检查。 Cloud Functions 的架构应该是这样的:
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 请求。但是,必须允许 OPTIONS HTTP 方法才能使 CORS 正常工作。当网页向另一个域请求内容时,浏览器可能会向目标域(在本例中为 Cloud Function)发送 preflight 请求,询问是否允许实际的 GET/POST/etc.. 请求。为了完成此操作,向服务器发送了一个 OPTIONS 请求,服务器必须响应以确认允许的 HTTP 方法。因此,要使函数按预期工作,它必须:
- Return OPTIONS 方法上的
Access-Control-Allow-XXX
headers。
- 接受任何其他方法 returns 实际响应,在本例中为 GET。
我已经关注了一些 Medium 文章以及 Google 自己的教程,但仍然无法在这个函数上使用 flask 启用 CORS :(
我缺少什么代码来启用 CORS?我想要 * 通配符,因为我希望所有服务/域都能够访问此功能和其他功能。
我听说 GCP 不能很好地与@app 配合使用。为什么,我不太确定。
请注意,我已经成功地直接在浏览器的 url 栏上测试了输出,并在 GCP 本身内触发了 JSON 测试。
我的预期用途仅用于 GET 请求。
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 似乎与 flask-cors 的工作方式不同。
首先,不要使用 Flask。每个函数都旨在成为一个单独的操作,而 Cloud Functions 已经负责请求路由和框架处理。
至于 CORS 问题,Cloud Functions documentation 中提供了有关如何处理 CORS 的示例。
在更新的代码中,您拒绝 PUT 请求并在 GET 方法而不是 OPTIONS 方法中返回 CORS headers。这不是上面链接的文档所做的,请仔细检查。 Cloud Functions 的架构应该是这样的:
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 请求。但是,必须允许 OPTIONS HTTP 方法才能使 CORS 正常工作。当网页向另一个域请求内容时,浏览器可能会向目标域(在本例中为 Cloud Function)发送 preflight 请求,询问是否允许实际的 GET/POST/etc.. 请求。为了完成此操作,向服务器发送了一个 OPTIONS 请求,服务器必须响应以确认允许的 HTTP 方法。因此,要使函数按预期工作,它必须:
- Return OPTIONS 方法上的
Access-Control-Allow-XXX
headers。 - 接受任何其他方法 returns 实际响应,在本例中为 GET。