如何处理 FastAPI 中路径操作的混淆?

Fel*_*ipe 2 python fastapi

我有两个看起来相似的路径操作函数,除了第一个返回特定用户的所有数据,第二个仅返回当前(登录)用户的数据(使用 schema UserOut,其字段较少) :

@router.get("/{id}", response_model=User)
async def get_user(user_id: PydanticObjectId):
    user = await User.find_one(User.id == user_id)
    if user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return user


@router.get("/me")
async def get_current_user(current_user: User = Depends(get_current_active_user)):
    return current_user
Run Code Online (Sandbox Code Playgroud)

问题是当我从 Postman 调用第二个方法时,它将端点/me作为id第一个端点,所以我总是收到 pydantic 验证错误"me" is not a valid user ID

我该如何解决这个问题?我是否需要修改我的端点或者是否有其他替代方案?

Dje*_*eth 6

您可以通过交换两个路径操作函数的位置(即在/mebefore 之前声明/{id})来很容易地解决这个问题:

@router.get("/me")
async def get_current_user():
    pass
    
@router.get("/{id}")
async def get_user():
    pass
Run Code Online (Sandbox Code Playgroud)

因为路径操作是按顺序评估的,所以这可以确保/me首先评估端点(这是一个固定路径,可用于获取有关当前用户的数据),如果不匹配,则/{id}接着评估端点(这用于通过某个用户 ID 获取有关特定用户的数据)。