【发布时间】:2021-01-25 17:59:38
【问题描述】:
我需要从我的 FastAPI 路径操作返回一个响应,但在此之前我想发送一个慢速请求并且我不需要等待该请求的结果,只要在以下情况下记录错误有的。我可以通过 Python 和 FastAPI 做到这一点吗?我不想将 Celery 添加到项目中。
这是我目前所拥有的,但它是同步运行的:
import asyncio
import requests
async def slow_request(data):
url = 'https://external.service'
response = requests.post(
url=url,
json=data,
headers={'Auth-Header': settings.API_TOKEN}
)
if not response.status_code == 200:
logger.error('response:', response.status_code)
logger.error('data', data)
@router.post('/order/')
async def handle_order(order: Order):
json_data = {
'order': order
}
task = asyncio.create_task(
slow_request(json_data)
)
await task
return {'body': {'message': 'success'}}
【问题讨论】:
-
如果你想要一劳永逸的任务,只需删除
await task语句。create_task已经安排了任务。 -
@alex_noname 它有效,谢谢!我非常接近解决方案=)如果您添加答案,我可以接受。
-
你也可以使用background task。
-
slow_request函数不会等待任何内容,这意味着尽管它是async def,但一旦开始运行,它将阻塞整个事件循环。您应该从 requests 切换到 aiohttp,它旨在在等待数据到达时屈服于事件循环。
标签: python python-asyncio fastapi