Asyncio.create_task() не выполняется асинхронно в функции асинхронного представления

Я создаю асинхронную функцию для загрузки видео. Цель состоит в том, чтобы запустить загрузку видео асинхронно в фоновом режиме, не заставляя пользователя ждать. Пока видео загружается, пользователь будет перенаправлен на другую страницу.

Следуя инструкциям в документации Python по asyncio, я использую create_task(), поскольку это кажется самым простым решением.

В следующем коде он работает, но не выполняется асинхронно. HttpResponseRedirect не выполняется до тех пор, пока видео не будет полностью загружено.

Я также вставил 2 строки, чтобы проверить, выполняется ли upload_video() асинхронно, и это так. print('before') и print('after') выводятся на консоль до того, как завершается функция upload_video. Однако заключительная HttpResponseRedirect() не выполняется до тех пор, пока не будет выполнен весь код.

async def my_async_func(request):
    if request.method == 'POST':
        video = request.FILES['video']
        print('before')
        asyncio.create_task(upload_video(video))
        print('after')
        return HttpResponseRedirect(... somewhere)


async def upload_video(video):
    ...

По сути, несмотря на весь асинхронный синтаксис и логику, которую я написал, функция все равно работает как типичная синхронная функция представления django.

Почему так происходит? Что нужно изменить, чтобы upload_video() выполнялось асинхронно и возвращало HttpResponseRedirect() без ожидания?

P.S. Я также попробовал заменить create_task() на ensure_future(), но это дало тот же результат - видео загружается, но не асинхронно.

Используйте цикл событий Django вместо стандартного:

tasks = set()

async def my_async_func(request):
    loop = asyncio.get_running_loop()
    if request.method == 'POST':
        video = request.FILES['video']
        print('before')
        task = loop.create_task(upload_video(video)
        tasks.add(task)
        tasks.add_done_callback(tasks.discard)
        print('after')
        return HttpResponseRedirect(... somewhere)


async def upload_video(video):
    ...

Кроме того, убедитесь, что вы сохранили ссылку на задачу, чтобы она не исчезла.

Вернуться на верх