我们在 Python 3.11 下使用 Flask-3.0.2。
我们想要编写一个高度可配置的 REST 服务,它可以管理几十个端点,这些端点的特性在配置文件(YAML 或 JSON)中定义,只要我们想要添加、删除或更改任何端点的行为,就可以更改该文件。
每个端点将由一个 python 文件管理,该文件在处理 REST 请求时动态加载。
我们不想每次添加、更改或删除路由时都编写并重写修饰过的 Python 路由函数。我们希望只有一个 Python 路由函数,该函数读取配置文件,然后每当传入的 URL 与配置文件中的条目匹配时,加载并调用匹配的端点特定动态加载函数。
例如,假设配置文件如下所示(YAML 示例):
---
actions:
/server/func0: func0.py
/server/func1: func1.py
/xyz/xyzfunc: xyzfunc.py
/abc/abcfunc: abcfunc.py
...
在这个例子中,发送到我们的 REST 服务器的 URLhttp://example.com/server/func0
会导致代码func0.py
被动态加载然后调用,类似的 URLhttp://example.com/abc/abcfunc
会导致abcfunc.py
代码被动态加载然后调用,等等。
此外,每个端点可以采用一组参数,这些参数也将通过 REST 调用的 URL 或 JSON 传递,并且这些参数可能会有所不同,具体取决于调用哪个端点。
我假设管理这个端点的 Flask 代码看起来像这样:
@app.route('/', methods=['GET', 'POST'])
def generic_router():
# Read the YAML file into a dictionary
# called `application_endpoints`.
path = flask.request.path
loadable_func = application_endpoints.get(path, None)
if not loadable_func:
# Handle non-managed endpoint and exit.
# Import and load the file in `loadable_func` and
# store the result in a variable called `the_package`.
# Invoke `func` with the arguments that were
# passed in, assuming that every imported file
# must implement a function called `run()`
results = the_package.run(flask.request.args)
# Then return the results.
我猜测这样的事情可能会有效,但我想知道是否有更好的方法来做到这一点,也许使用 Flask 的其他功能,甚至使用 Flask-RESTful 或其他 Flask 衍生产品。
我们不想使用 Flask 或其衍生产品以外的任何东西。
要明确的是,目标是只有一个由配置文件驱动的单一修饰路由函数,而不是多个修饰路由函数,每个可能的端点 URL 一个。