Как сделать асинхронный ответ в 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()