FastAPI 生成“openapi.json”文件并为其提供接口。
为了进行实验,我需要将其替换为第三方文件。
from pathlib import Path
import json
app.openapi_schema = json.loads(Path(r"myopenapi.json").read_text())
当我将此代码放在端点后面时,例如“/”
@app.get("/", include_in_schema=FULL_SCHEMA)
def read_root():
# code here
调用一次端点后,“/docs”界面会显示加载的myopenapi.json,并覆盖原来的。功能没有改变,旧的定义仍然有效。
我希望能够在 FastAPI 完成设置并创建所有端点后直接进行切换。
将其放入启动代码块中不起作用 (
async def lifespan(app: FastAPI):
) - 当达到 yield
时,app.openapi _schema
尚未创建。
FastAPI应用程序生成后更改的正确位置在哪里?
FastAPI 使用以下命令启动:
uvicorn.run(app, host=SERVER_HOST, port=SERVER_PORT, workers=1)
@Helen 在评论部分有正确的想法
“问题”是 FastAPI 中的 openapi 模式是按需创建的,而不是在启动时创建的。
添加此代码即可工作
def custom_openapi():
if app.openapi_schema:
return app.openapi_schema
openapi_schema= yaml.safe_load(Path("swagger.yaml").read_text())
# remove the server from the schema
del openapi_schema['servers']
app.openapi_schema = openapi_schema
return app.openapi_schema
app = FastAPI()
app.openapi = custom_openapi
并且还可以在
StarletteHTTPException
上添加异常处理程序,然后针对那些未实现的伪造端点,使用 404
切换出 501
错误。