我想创建一个模块化的应用程序,其中不同的子API将可用。这些API可以通过配置来启用/禁用。
下面是他们的文档中显示的FastAPI示例:
from fastapi import FastAPI
app = FastAPI()
@app.get("/app")
def read_main():
return {"message": "Hello World from main app"}
subapi = FastAPI()
@subapi.get("/sub")
def read_sub():
return {"message": "Hello World from sub API"}
app.mount("/subapi", subapi)这是我想要做的:
from fastapi import FastAPI
app = FastAPI()
@app.get("/app")
def read_main():
return {"message": "Hello World from main app"}
endpoints = ['subapi1', 'subapi2, 'somethingelse']
for e in endpoints:
x = FastAPI()
@x.get("/sub")
def read_sub():
return {"message": "Hello World from the "+x.root_path+" sub API"}
app.mount("/"+e, x)所以它会有这样的行为:
GET /subapi1/sub
{"message": "Hello World from the subapi1 sub API"}
GET /subapi2/sub
{"message": "Hello World from the subapi2 sub API"}
GET /somethingelse/sub
{"message": "Hello World from the somethingelse sub API"}但显然,动态装饰器语法不起作用,root_path属性也不可用。有什么方法可以实现我想做的事情吗?我觉得我好像错过了什么。
发布于 2021-10-18 18:02:50
您可以创建一个APIRouter实例,并根据需要将其包含在任意多个前缀下:
from fastapi import Request, FastAPI, APIRouter
import uvicorn
subapi = APIRouter()
@subapi.get('')
async def subapi_get(request: Request):
return {'i_am': request.url.path}
app = FastAPI()
endpoints = ('foo', 'bar', 'baz')
for endpoint in ('foo', 'bar', 'baz'):
app.include_router(subapi, prefix=f'/{endpoint}')
if __name__ == '__main__':
uvicorn.run(app='foo:app', reload=True, debug=True)这将使用/foo、/bar和/baz下的当前路径进行回答。
https://stackoverflow.com/questions/69616291
复制相似问题