Google Cloud Functions Python3:使用端点包装HTTP触发器函数



我正在探索Python中的Google Cloud Functions来编写HTTP触发的函数。我有一个main.py,我所有的触发函数的结构都像这篇文章中一样,但希望能够包装一些端点。在nodejs上,人们可以像在这篇文章中使用Express一样这样做,而在Python上,使用Flask非常相似。

我试图通过使用Flask包装我的Cloud Functions来涉足,但Google会将我带到Google的身份验证页面。我的代码如下:

from flask import Flask, jsonify, request
# Initialize Flask application
application = Flask(__name__)
@application.route('/some/endpoint/path', methods=['GET'])
def predict():
inputs = request.args.get('inputs')
//Some logic...
response_object = {}
response_object['statusCode'] = 200
response_object['results'] = results
return jsonify(response_object)

有没有办法以这种方式包装 python 云函数来实现这样的事情?

https://us-central1-my-project.cloudfunctions.net/some
https://us-central1-my-project.cloudfunctions.net/some/endpoint
https://us-central1-my-project.cloudfunctions.net/some/endpoint/path

我相信您正在获得身份验证Google屏幕,因为您正在尝试访问项目上Cloud Functions的基本URL。

使用HTTP云函数时,触发器URL通常是https://[REGION]-[PROJECT_ID].cloudfunctions.net/[FUNCTION_NAME]的,所以任何路由都需要在函数名称后面跟另一个斜杠。

话虽如此,我找到了这篇文章,其中提供的解决方案设法在同一 main.py 文件中设置路由,以从单个云函数访问端点。我不得不适应一些东西,但最终它对我有用。

以下是我最后测试的源代码:

import flask
import werkzeug.datastructures
app = flask.Flask(__name__)

@app.route('/')
def root():
return 'Hello World!'

@app.route('/hi')
def hi():
return 'Hi there'

@app.route('/hi/<username>')
def hi_user(username):
return 'Hi there, {}'.format(username)

@app.route('/hi/<username>/congrats', methods=['POST'])
def hi_user_congrat(username):
achievement = flask.request.form['achievement']
return 'Hi there {}, congrats on {}!'.format(username, achievement)

def main(request):
with app.app_context():
headers = werkzeug.datastructures.Headers()
for key, value in request.headers.items():
headers.add(key, value)
with app.test_request_context(method=request.method, base_url=request.base_url, path=request.path, query_string=request.query_string, headers=headers, data=request.form):
try:
rv = app.preprocess_request()
if rv is None:
rv = app.dispatch_request()
except Exception as e:
rv = app.handle_user_exception(e)
response = app.make_response(rv)
return app.process_response(response)

这在单个云函数中定义了以下路由:

https://[REGION]-[PROJECT_ID].cloudfunctions.net/[FUNCTION_NAME]
https://[REGION]-[PROJECT_ID].cloudfunctions.net/[FUNCTION_NAME]/hi
https://[REGION]-[PROJECT_ID].cloudfunctions.net/[FUNCTION_NAME]/hi/<username>
https://[REGION]-[PROJECT_ID].cloudfunctions.net/[FUNCTION_NAME]/hi/<username>/congrats

以下是用于部署此函数的命令:

gcloud functions deploy flask_function --entry-point main --runtime python37 --trigger-http --allow-unauthenticated

Cloud Functions 旨在用作单个端点。您可以考虑改用 Cloud Run,因为它更适合具有多个路由的应用程序,并且具有许多与云函数相同的优势。

如果您已经决定使用云函数,那么类似于将烧瓶请求注入另一个 Flask 应用程序的答案应该可以工作,但这并不理想。

最新更新