运行时在 FastAPI 中重新加载路由

ibi*_*tux 7 python fastapi uvicorn

我有一个 FastAPI 应用程序,其中基于数据库配置动态生成路由。

但是,一旦定义了路由并且应用程序运行,如果配置发生更改,似乎无法重新加载配置以便路由可以反映配置。我现在唯一的解决方案是通过重新启动 uvicorn 来手动重新启动 asgi 应用程序。

有没有什么方法可以在不停止应用程序的情况下完全重新生成路由,最好可以从 URL 调用?

Seb*_*eft 2

可以在运行时修改路由。

FastAPIadd_api_route应用程序具有允许您动态定义新端点的方法。要删除端点,您需要直接修改底层Router.

以下代码展示了如何动态添加和删除路由。

import fastapi

app = fastapi.FastAPI()


@app.get("/add")
async def add(name: str):
    async def dynamic_controller():
        return f"dynamic: {name}"
    app.add_api_route(f"/dyn/{name}", dynamic_controller, methods=["GET"])
    return "ok"


def route_matches(route, name):
    return route.path_format == f"/dyn/{name}"


@app.get("/remove")
async def remove(name: str):
    for i, r in enumerate(app.router.routes):
        if route_matches(r, name):
            del app.router.routes[i]
            return "ok"
    return "not found"
Run Code Online (Sandbox Code Playgroud)

下面展示了如何使用它

$ curl 127.0.0.1:8000/dyn/test
{"detail":"Not Found"}
$ curl 127.0.0.1:8000/add?name=test
"ok"
$ curl 127.0.0.1:8000/dyn/test
"dynamic: test"
$ curl 127.0.0.1:8000/add?name=test2
"ok"
$ curl 127.0.0.1:8000/dyn/test2
"dynamic: test2"
$ curl 127.0.0.1:8000/remove?name=test
"ok"
$ curl 127.0.0.1:8000/dyn/test
{"detail":"Not Found"}
$ curl 127.0.0.1:8000/dyn/test2
"dynamic: test2"
Run Code Online (Sandbox Code Playgroud)

但请注意,如果动态更改路由,则需要使 OpenAPI 端点的缓存失效。

  • 如何“使 OpenAPI 端点的缓存失效”?是否可以以类似的方式(使用 Graphene)动态添加 GraphQL 端点? (2认同)