ibi*_*tux 7 python fastapi uvicorn
我有一个 FastAPI 应用程序,其中基于数据库配置动态生成路由。
但是,一旦定义了路由并且应用程序运行,如果配置发生更改,似乎无法重新加载配置以便路由可以反映配置。我现在唯一的解决方案是通过重新启动 uvicorn 来手动重新启动 asgi 应用程序。
有没有什么方法可以在不停止应用程序的情况下完全重新生成路由,最好可以从 URL 调用?
可以在运行时修改路由。
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 端点的缓存失效。