Как выполнить асинхронный возврат из обработчика сервера aiohttp? - PullRequest
0 голосов
/ 20 мая 2019

Я использую http-сервер для обработки слабых вызовов API, которые приходят на конечную точку events. Неполная документация предполагает, что приложение (этот сервер) должно подтвердить получение запроса в течение 3 секунд (что может быть достигнуто пустым телом и статусом = 200). Моя обработка запроса занимает более 3 секунд, поэтому я хочу немедленно вернуться, как только получу запрос с пустым ответом, а затем обработать данные. Это код, который я использую:

from aiohttp import web

routes = web.RouteTableDef()
app = web.Application()


async def process(data):
    # Do Some Processing which takes more than 5 seconds


@routes.post('/events')
async def handle_event(request):
    post_data = await request.json()
    await process(post_data)

    return web.Response(body="", status=200) 
    # I want to do this immediately then process() data afterwards

app.add_routes(routes)
web.run_app(app, port=3000)

Как мне немедленно вернуться, а затем обработать данные (которые включают в себя некоторые запросы к базе данных и отправку слабого сообщения с использованием API)

Я попытался создать задачу asyncio, но возврат не происходит, пока не завершится выполнение этой задачи (что понятно):

    process_task = asyncio.create_task(process)
    await task

...