Джанго — отображать прогресс действия

У меня есть функция, контролируемая администратором (импорт базы данных), которая может занять некоторое время, поэтому я хочу показать пользователю некоторую обратную связь в течение этого времени, например, индикатор выполнения или просто некоторые сообщения. Даже отправка страницы по частям во время длительного действия была бы достаточной.

Какой самый простой способ сделать это в Django?


person hmp    schedule 10.10.2009    source источник
comment
почему бы не индикатор выполнения?.. не могли бы вы немного уточнить, пожалуйста?   -  person 0100110010101    schedule 11.10.2009
comment
Индикатор выполнения тоже будет в порядке, но я не знаю, как я могу управлять им из функции, выполняющей действие.   -  person hmp    schedule 11.10.2009


Ответы (2)


  1. Опрос Ajax. Используя таймер на стороне клиента, вы постоянно опрашиваете сервер о его статусе. Процесс выглядит следующим образом: пользователь настраивает детали базы данных и нажимает «загрузить». Файл передается, и запрос страницы запускает асинхронный процесс на сервере для выполнения импорта базы данных. Когда пользователь нажимает «Загрузить», он запускает таймер на стороне клиента, который через равные промежутки времени отправляет запрос AJAX на сервер, чтобы спросить его о ходе выполнения. Сервер возвращает JSON, а скрипт на стороне клиента выясняет, что он хочет с ним сделать.

  2. COMET — я не так хорошо знаком с этим, но традиционный AJAX работает, когда клиент отправляет запрос на сервер. Это известно как «вытягивающее» общение. В COMET это толчок. Сервер отправляет клиенту данные о своем прогрессе, даже если сервер этого не запрашивал. Это создает ситуацию с меньшей нагрузкой на сервер, чем опрос. Google выдает некоторые результаты для людей, использующих COMET с Django< /а>.

  3. Обратный AJAX — аналог COMET. Обратный Ajax с Django.

(Извините, я меньше всего знаю о последних двух, но я подумал, что вы, по крайней мере, хотели бы знать, что они существуют)

person T. Stone    schedule 11.10.2009

Это невозможно сделать без каких-либо сценариев на стороне клиента, т.е. Ajax. Вам нужно что-то, что будет регулярно опрашивать сервер и показывать ответ пользователю. Есть фрагмент, показывающий, как это можно сделать.

Конечно, чтобы сделать это возможным, вам также придется передать сам импорт в автономный процесс. Это будет выполнять импорт и регулярно записывать его ход где-то (в файле или базе данных), чтобы Ajax мог запросить его. Хорошим способом сделать это может быть использование celery, распределенной задачи на основе Django. очередь.

Наконец, вам понадобится простое представление, которое будет вызывать Ajax, которое будет запрашивать долго выполняющийся процесс (или просматривать запись о ходе выполнения, которую он создает) и отчитываться перед клиентом.

Итак, довольно сложно.

person Daniel Roseman    schedule 10.10.2009