Как сделать асинхронный ответ в Django?

Необходимо отдать 204 ответ сервера не дожидаясь выполнения подпрограммы (django v3.1.5). Попытался сделать через asyncio

views.py

@sync_to_async
@csrf_exempt
@async_to_sync
async def product_update(request):
    if request.method == 'POST':
        loop = asyncio.get_event_loop()
        loop.create_task(do_somthing())

        print('---------------- 1 ----------------')
        return HttpResponse(status=204)
    else:
        HttpResponseForbidden()

async def do_somthing():
    await asyncio.sleep(5)
    print('---------------- 2 ----------------')

Но так не выполняется функция do_somthing(), в консоле только:

---------------- 1 ----------------
[16/Feb/2021 18:00:12] "POST /api/test/update/ HTTP/1.1" 204 0

Ответы (1 шт):

Автор решения: m0nte-cr1st0

Как вариант, взять какой-нибудь асинхронный фреймворк. Например, dramatiq (есть удобная имплементация - django_dramatiq - https://github.com/Bogdanp/django_dramatiq)

tasks.py

import dramatiq


@dramatiq.actor
def do_somthing():
    print("Async task")

views.py

@csrf_exempt
def product_update(request):
    if request.method == 'POST':
        do_somthing.send()
        return HttpResponse(status=204)
    else:
        HttpResponseForbidden()
→ Ссылка