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

sal*_*ius 3 fastapi

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

\n
    @router.get("/{employee_id}}", status_code=200, response_model=schemas.EmployeeOut)\n    async def get_employee(\n            employee_id: int = Path(default=..., ge=0, description=\'Id \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x83\xd1\x87\xd0\xb0\xd0\xb5\xd0\xbc\xd0\xbe\xd0\xb3\xd0\xbe \xd1\x81\xd0\xbe\xd1\x82\xd1\x80\xd1\x83\xd0\xb4\xd0\xbd\xd0\xb8\xd0\xba\xd0\xb0.\', example=8),\n            token: str = Depends(config.oauth2_scheme),\n            postgres_session: AsyncSession = Depends(database.get_db)):\n        try:\n            token_payload = services.get_token_payload(token=token)\n            if token_payload[\'role\'] in (config.OPERATOR_ROLE, config.OPERATOR_ROLE, config.CLINIC_ROLE):\n                return (await postgres_session.execute(statement=models.employees.select().where(\n                    models.employees.c.id == employee_id))).fetchone()\n            else:\n                raise config.known_errors[\'forbidden\']\n        except Exception as error:\n            services.error_handler(error)\n    \n    # Just as example!\n    @router.get("/me}", status_code=200, response_model=List[schemas.TicketOut])\n    async def get_me(\n            token: str = Depends(config.oauth2_scheme)):\n        token_payload = services.get_token_payload(token=token)\n        get_employee(employee_id=token_payload[\'sub\'])\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

Min*_*tel 6

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

像这样的东西:

@router.post('/api/action1')
@router.post('/api/action2')
def do_action():
  pass
Run Code Online (Sandbox Code Playgroud)