Не ждать результата базы данных в асинхронном представлении в Django

#python-3.x #django #async-await #django-views

#python-3.x #django #async-ожидание #django-views

Вопрос:

У меня есть асинхронное представление в Django 3.1:

 async def log_click(request):
    await sync_to_async(Click.objects.create)(author=request.user)
    return HttpResponse('<html>Clicked</html>')
  

Возможно ли улучшить производительность этого представления, не дожидаясь создания Click экземпляра? Я попытался опустить await и использовать asyncio.create_task :

 async def log_click(request):
    asyncio.create_task(sync_to_async(Click.objects.create)(author=request.user))
    return HttpResponse('<html>Clicked</html>')
  

однако в этом случае Click экземпляр вообще не создается. Я хочу, чтобы это представление завершило выполнение как можно быстрее, но все равно создало Click экземпляр.

Ответ №1:

Я допустил ошибку в своем коде. asyncio.create_task() Это асинхронная функция, следовательно, для нее требуется await оператор:

 async def log_click(request):
    await asyncio.create_task(sync_to_async(Click.objects.create)(author=request.user))
    return HttpResponse('<html>Clicked</html>')
  

Комментарии:

1. Я пробовал что-то подобное при просмотре вашего вопроса вчера, но безуспешно. Могу я спросить, какую версию python вы используете и какой локальный сервер вы используете для тестирования? (знает ли runserver, как это обработать?)

2. @romaingz Я использовал Python 3.8.5 и Django 3.1. Да, я протестировал, и все работало нормально с помощью manage.py runserver команды. Я также написал рабочий тест с использованием django.test.TransactionTestCase .