首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FastAPI动态生成子接口

FastAPI动态生成子接口
EN

Stack Overflow用户
提问于 2021-10-18 12:43:25
回答 1查看 105关注 0票数 0

我想创建一个模块化的应用程序,其中不同的子API将可用。这些API可以通过配置来启用/禁用。

下面是他们的文档中显示的FastAPI示例:

代码语言:javascript
复制
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)

这是我想要做的:

代码语言:javascript
复制
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)

所以它会有这样的行为:

代码语言:javascript
复制
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属性也不可用。有什么方法可以实现我想做的事情吗?我觉得我好像错过了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-18 18:02:50

您可以创建一个APIRouter实例,并根据需要将其包含在任意多个前缀下:

代码语言:javascript
复制
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下的当前路径进行回答。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69616291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档