Django Processing Bar между двумя запросами
У меня есть приложение, требующее вычислений, оно принимает входные данные и обрабатывает около 10-15 формул на входных данных, включая NPV, IRR-подобные вычисления. Я реализую вычисления, используя шаблонные теги в django. Ниже приведены фрагменты кода :
[filters.py][1]
@register.filter
def **client_irr**(value,arg):
fcf_list = []
for i in arg:
fcf_list.append(fcf(value,i))
return round(npf.irr(fcf_list) * 100,2)
[inputs.html][2]
<div class="products-row">
<div class="product-cell price">{{ i.parameter }}</div>
<div class="product-cell price">{{ i.units }}</div>
<div class="product-cell price">{{ i.values|**client_irr:**total_time}}</div>
</div>
Я правильно выполняю эти вычисления? Я не уверен, я считаю этот способ совершенно неправильным!
Запрос на (/inputs) вычисление значений занимает около 20-22 секунд, и пользовательский интерфейс застревает, что создает очень неприятные ощущения для пользователя (UX).
Итак, я ищу либо панель обработки (по которой я не могу получить хороший учебник в Django), либо способ оптимизировать эти вычисления.
Спасибо, друзья!!! Это много значит! Если у вас есть какие-либо решения, пожалуйста, помогите!
Я бы рекомендовал использовать задачу celery, которая разгрузит обработку от конечной точки и увеличит время отклика, когда вы запускаете задачу celery, celery предоставит вам ID задачи, который вы можете использовать позже для отслеживания прогресса в реальном времени. Посмотрите https://docs.celeryproject.org/en/stable/userguide/tasks.html#custom-states для хранения пользовательских состояний и прогресса для задачи celery.
Для отслеживания хода обработки в реальном времени на передней стороне я бы рекомендовал использовать django-channels
https://channels.readthedocs.io/en/stable/ и открыть соединение websocket на вашей веб-странице для отслеживания начатой задачи. Это означает, что вы можете предоставлять обновления в реальном времени на вашем front-end по мере выполнения задачи celery, а не опрашивать какую-то конечную точку REST api каждые X секунд для проверки прогресса. Каждый раз при завершении вычисления вы можете отправлять сообщение из celery в соединение канала websocket, к которому подключился пользователь
Каждый раз, когда веб-сайт получает новое сообщение о соединении по websocket, оно может содержать процент прогресса, и вы можете заставить индикатор прогресса обновляться каждый раз.