我如何为类似的 url/路由器创建别名(调用相同的处理程序),例如https://myapi/users/5和https://myapi/users/me(我的 id 放置在令牌中,它是 5)。
@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\'])\nRun Code Online (Sandbox Code Playgroud)\n这些函数几乎相同,唯一的区别是在第二个函数中没有路径参数employee_id,但它无论如何都存在于令牌中。
您可能想知道为什么需要meurl - 这只是为了方便
有可能的。您可以使用 API 路径规范指定多个装饰器。如果仔细观察router.post实现,您会发现装饰器返回的不是包装函数,而是原始函数,因此您可以安全地将其传递给另一个装饰器。
像这样的东西:
@router.post('/api/action1')
@router.post('/api/action2')
def do_action():
pass
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3019 次 |
| 最近记录: |