#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
.