Cloud Functionsでパスルーティングしてみる(Python)

Cloud Functionsは1つのURLに対してパスベースで複数の処理を実装することができるのか調べてみました。
結論こちらを参考にできました。
import flask
import werkzeug.datastructures

app = flask.Flask(__name__)

@app.route('/')
def root():
    return 'index'


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


@app.route('/hello/<username>')
def hello_user(username):
    return f'Hello, {username}'


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)
エントリポイントをmainに指定してデプロイします。
$ curl https://asia-northeast1-my-project.cloudfunctions.net/flask
index
$ curl https://asia-northeast1-my-project.cloudfunctions.net/flask/hello
Hello World
$ curl https://asia-northeast1-my-project.cloudfunctions.net/flask/hello/hoge
Hello, hoge


FastAPIを使うものも見つけました。

こちらもパスルーティングに対応しています。
$ curl https://asia-northeast1-my-project.cloudfunctions.net/fastapi
{"Hello":"World"}
$ curl https://asia-northeast1-my-project.cloudfunctions.net/fastapi/items/123?q=apple
{"item_id":123,"q":"apple"}