【问题标题】:Capture unique id in router.post fastapi在 router.post fastapi 中捕获唯一 ID
【发布时间】:2022-09-23 04:36:34
【问题描述】:

我正在尝试使用以下方法在 python 中使用 fastapi 捕获 api 所花费的时间:

import string, time, random, logging
from starlette.requests import Request

@app.middleware(\"http\")
async def log_requests(request: Request, call_next):
    idem = \'\'.join(random.choices(string.ascii_uppercase + string.digits, k=6))
    logger.info(f\"rid={idem} start request path={request.url.path}\")
    start_time = time.time()
    response = await call_next(request)
    process_time = (time.time() - start_time) * 1000
    formatted_process_time = \'{0:.2f}\'.format(process_time)
    logger.info(f\"rid={idem} completed_in={formatted_process_time}ms status_code={response.status_code}\")
    return response

我想在@router.post 部分中捕获唯一ID idem,如下所示,但它给出了错误:

import logging as log

@router.post(\"/infer/\", response_description=\"AD Data Infer\")
async def ad_infer_algorithm(ad_infer_config: ADInferConfigSchema = Body(...)):
  log.info(\"Executing AD Train Algorithm with config\"+idem)
  return \"2\"

请帮助

  • 如果您想将元数据附加到请求中,您可以在log_requests 中执行request.state.idem = idem,然后将request: Request 作为参数添加到ad_infer_algoritm 并再次使用request.state.idem 检索它。那对你有用吗?
  • @MatsLindh 这完美无瑕。只是不要在评论中,而是以适当的方式写下这个,以便我可以接受您的答案作为已解决。

标签: python gunicorn fastapi


【解决方案1】:

FastAPI 在request 对象上有一个state 属性。这允许您将状态附加到来自中间件的请求,然后在您的控制器(或另一个中间件)中访问该状态。

由于您的中间件中已经有了request 对象,您可以将idem 附加到那里的请求状态:

async def log_requests(request: Request, call_next):
    idem = ''.join(random.choices(string.ascii_uppercase + string.digits, k=6))
    request.state.idem = idem

(旁注:您可能可以将 random.choices 调用替换为 secrets.token_urlsafe 以获得随机生成的标识符(除非您需要控制大写和小写标识符 - 因为您没有包含 ascii_lowercase)。

然后,您可以在视图控制器中访问该状态:

@router.post("/infer/", response_description="AD Data Infer")
async def ad_infer_algorithm(request: Request, ad_infer_config: ADInferConfigSchema = Body(...)):
  log.info("Executing AD Train Algorithm with config" + request.state.idem)
  return "2"

(另一个注意事项:日志记录命令通常应使用占位符 (%s),然后使用变量作为参数:log.info("Executing AD Train Algorithm with config %s", request.state.idem)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2023-03-25
    • 2010-10-12
    相关资源
    最近更新 更多