url/router/endpoint 的 Fastapi 别名(为它们设置相同的处理程序)

Fastapi alias for url/router/endpoint (set same handler for them)

我如何为 https://myapi/users/5https://myapi/users/me 等类似的 url/routers 创建别名(调用相同的处理程序)(我的 ID 放在令牌中,它是 5)。

@router.get("/{employee_id}}", status_code=200, response_model=schemas.EmployeeOut)
async def get_employee(
        employee_id: int = Path(default=..., ge=0, description='Id получаемого сотрудника.', example=8),
        token: str = Depends(config.oauth2_scheme),
        postgres_session: AsyncSession = Depends(database.get_db)):
    try:
        token_payload = services.get_token_payload(token=token)
        if token_payload['role'] in (config.OPERATOR_ROLE, config.OPERATOR_ROLE, config.CLINIC_ROLE):
            return (await postgres_session.execute(statement=models.employees.select().where(
                models.employees.c.id == employee_id))).fetchone()
        else:
            raise config.known_errors['forbidden']
    except Exception as error:
        services.error_handler(error)

# Just as example!
@router.get("/me}", status_code=200, response_model=List[schemas.TicketOut])
async def get_me(
        token: str = Depends(config.oauth2_scheme)):
    token_payload = services.get_token_payload(token=token)
    get_employee(employee_id=token_payload['sub'])

这些函数几乎相同,唯一的区别是在第二个函数中没有路径参数employee_id,但它无论如何都存在于令牌中。

您可能想知道为什么需要 me url - 这只是为了方便

/me端点需要在/{employee_id}
之上 看看这个 link:https://fastapi.tiangolo.com/tutorial/path-params/#order-matters

有可能。您可以使用 API 路径规范指定多个装饰器。 如果您仔细观察 router.post 实现,您会发现装饰器 returns 不是包装函数,而是原始函数,因此您可以安全地将它传递给另一个装饰器。

像这样:

@router.post('/api/action1')
@router.post('/api/action2')
def do_action():
  pass