url/router/endpoint 的 Fastapi 别名(为它们设置相同的处理程序)
Fastapi alias for url/router/endpoint (set same handler for them)
我如何为 https://myapi/users/5
和 https://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
我如何为 https://myapi/users/5
和 https://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