Обновите HttpResponse каждые несколько секунд - PullRequest
0 голосов
/ 18 ноября 2009

Мое приложение в Django может создавать несколько очень больших запросов SQL. В настоящее время я использую объект HttpRequest для необходимых мне данных, затем HttpResponse, чтобы вернуть то, что я хочу показать пользователю.

Очевидно, я могу позволить пользователю подождать минуту, пока эти многочисленные наборы запросов выполняются и извлечены из базы данных, а затем вернуть эту монолотическую HTML-страницу.

В идеале я хотел бы обновить страницу, когда захочу, что-то вроде:

For i,e in enumerate(example):

    Table.objects.filter(someObjectForFilter[i]).

    #Return the object to the page.
    #Then Loop again, 'updating' the response after each iteration.

Возможно ли это?

Ответы [ 2 ]

4 голосов
/ 18 ноября 2009

Недавно я обнаружил, что HttpResponse может быть генератором:

def myview(request, params):
    return HttpResponse(mygenerator(params))


def mygenerator(params):
    for i,e in enumerate(params):
        yield '<li>%s</li>' % Table.objects.filter(someObjectForFilter[i])

Это будет постепенно возвращать результаты mygenerator на страницу, обернутые в HTML <li> для отображения.

2 голосов
/ 18 ноября 2009

Ваш подход немного ошибочен. У вас есть несколько разных вариантов.

Первый, вероятно, самый простой - используйте AJAX и HTTPRequest. Имейте ряд из них, каждый из которых приводит к одному Table.objects.filter(someObjectForFilter[i]).. По окончании каждого сценария завершается и возвращает результаты клиенту. Клиент обновляет пользовательский интерфейс и инициирует следующий запрос с помощью другого вызова AJAX.

Другой метод - использовать пакетную систему. Это немного тяжелее, но, вероятно, лучше дизайн, если вы собираетесь по-настоящему "тяжелой работы" в базе данных. Вам нужно будет запустить пакетный демон (для этого прекрасно работает cron-зонд), сканирующий входящие задачи. Пользователь хочет что-то выполнить, поэтому его запрос отправляет эту задачу (это может быть просто строка в базе данных со своими параметрами). Демон захватывает его, обрабатывает полностью в автономном режиме - возможно, даже на другой машине - и обновляет строку задачи, когда она завершена с результатами. Затем клиент может периодически обновляться для проверки состояния этой строки с помощью традиционных методов или методов AJAX.

...