python-3.x 在运行时向FastAPI添加新端点

oalqel3c  于 2022-11-26  发布在  Python
关注(0)|答案(1)|浏览(136)

我有一个基于FastAPI的API网关服务和一些特定的服务(如插件)来连接它。其中之一是Auth服务,它处理用户帐户和访问令牌。例如Auth服务想告诉AG他提供的新功能,并在运行时在AG中注册新端点。
我看到以下步骤:

  1. Auth在AG中创建新端点,例如/new_endpoint;
    1.所有发往http://AG/new_endpoint的流量都将重定向到http://Auth/...
    我查看了FastAPI.add_api_route方法来添加新端点。它在运行时工作-我使用curl检查。
    刷新http://AG/docs页面后没有效果,因为OpenAPI架构已缓存。我希望重新生成OpenAPI架构并在OpenAPI页面上看到/new_endpoint
bfrts1fy

bfrts1fy1#

我想我找到了如何重新生成OpenAPI模式的解决方案。
1.删除缓存app.openapi_schema = None
1.重新生成架构app.setup()

from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
from pydantic import BaseModel

app = FastAPI()

class NewEndpointResponse(BaseModel):
    status: str
    method: str
    url_path: str

async def catch_all(request: Request) -> JSONResponse:
    """
    Your new endpoint handler
    """
    # some logic to interact with Auth-service
    # like: requests.get("http://Auth/...")
    res = NewEndpointResponse(status="OK", method=request.method, url_path=request.url.path)
    return JSONResponse(res.dict(), status_code=200)

class EndpointRegisterDTO(BaseModel):
    endpoint: str = "/new_endpoint"
    method: str = "GET"
    name: str = "Extra Functionality"

@app.post("/register/endpoint")
async def add_endpoint(request: EndpointRegisterDTO):
    """
    Adds new endpoint at runtime
    """
    app.add_api_route(
        request.endpoint,
        catch_all,
        methods=[request.method],
        name=request.name,
        response_model=NewEndpointResponse)
    app.openapi_schema = None
    app.setup()
    return {"status": "OK"}

1.打开http://AG/docs。只有一个端点可用。
1.按下“Try it out”(试用)并使用建议的参数执行POST /register/endpoint
1.刷新http://AG/docs-现在您可以看到/new_endpoint
1.调用GET /new_endpoint并检查响应是否正确。
这个解决方案有点难看,但是很有效!我认为调试它非常困难!

相关问题