我尝试创建一个 fastapi 路由器来处理 2 个 int 类型的路径参数。
我希望它用我在 swagger ui 中输入的值替换占位符(即 {parameter_name})。
仅替换其中一个参数,另一个保留为带 url 编码大括号的变量名,即“%parameter_name%”。
我用fastapi定义了这条路线:
api_router = APIRouter(prefix="user/{user_id}")
@api_router.put("/post/{post_id}")
def module_deep_clone(
user_id: int,
post_id: int,
):
return {"post_id": post_id, "company_id": company_id}
使用生成的 Swagger ui 会导致错误的请求 url,其中一个路径变量不会替换为以下值: “http://0.0.0.0:8000/user/123/post/{post_id}”
这会导致验证错误,因为 post_id 应该是整数而不是“%7Bpost_id%”
当我替换函数中参数定义的顺序时:
@api_router.put("/post/{post_id}")
def module_deep_clone(
post_id: int,
user_id: int,
):
生成的网址是: “http://0.0.0.0:8000/user/{user_id}/post/123”
这让我觉得 Swagger 只期望一个参数,但生成的 openapi.json 中的相关部分如下所示:
"parameters": [
{
"name": "company_id",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"title": "Company Id"
}
},
{
"name": "item_id",
"in": "path",
"required": true,
"schema": {
"type": "integer",
"title": "Item Id"
}
}
]}
我正在使用 python 3.11,fastapi 0.101.1。
我错过了什么?
谢谢
这是最新版本的 Swagger UI 中的一个错误。 您可以使用旧版本来克服它(https://github.com/tiangolo/fastapi/discussions/11572#discussioncomment-9403528):
app = FastAPI(docs_url=None) # Disable default docs
from fastapi.openapi.docs import (get_swagger_ui_html,
get_swagger_ui_oauth2_redirect_html)
@app.get("/docs", include_in_schema=False)
async def custom_swagger_ui_html():
return get_swagger_ui_html(
openapi_url=app.openapi_url,
title=app.title + " - Swagger UI",
oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url,
swagger_js_url="https://unpkg.com/[email protected]/swagger-ui-bundle.js",
swagger_css_url="https://unpkg.com/[email protected]/swagger-ui.css",
)