Django - отображать ход действия - PullRequest
6 голосов
/ 10 октября 2009

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

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

Ответы [ 2 ]

3 голосов
/ 11 октября 2009
  1. Ajax Polling - Используя таймер на стороне клиента, вы постоянно опрашиваете сервер о его состоянии. Процесс такой: пользователь настраивает детали базы данных и нажимает кнопку «загрузить». Передача файла и запрос страницы запускает асинхронный процесс на сервере для выполнения импорта базы данных. Когда пользователь нажимает кнопку загрузки, он запускает таймер на стороне клиента, который через равные промежутки времени отправляет AJAX-запрос на сервер, чтобы спросить его о ходе выполнения. Сервер возвращает JSON, а клиентский скрипт выясняет, что он хочет с ним делать.

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

  3. Обратный AJAX - аналогично COMET. Обратный Аякс с Джанго .

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

1 голос
/ 11 октября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...