Прямое (длительное опрашивание) соединение с Django через Nginx (или apache) - сокращение количества запросов - PullRequest
1 голос
/ 07 августа 2011

У меня есть таблица примерно такая:

class last10msg(models.Model):
    user = models.ForeignKey(User)
    date = models.DateField()
    msg = models.CharField(max_length=254) 

Я хочу создать длинный опрос, который обновит таблицу на стороне клиента с последними 10 строками в таблице из базы данных.

сначала это было так:

пользователь отправляет ajax-запрос на последние 10 строк ответа table.server и и js-таблицу обновления кода с изменением или теми же данными. Затем пользователь отправляет другой запрос.

тогда я думаю, что проверить, являются ли данные новыми на сервере (сравнить последнюю дату в запросе с самой поздней датой в таблице, которую пользователь отправил с помощью ajax-запроса), отправить ответ еще бездействующий 1 мин, а затем снова проверить, если новый ответ об отправке еще неактивен 1 миль. ... Затем пользователь отправляет другой запрос.

наконец:

Я думаю, что можно отправить весь запрос в глобальную работающую функцию, и эта функция получит все строки из последней проверки и, если они новые (сравните дату с датой отправки из клиента и request.user с полем пользователя), вернет ответ на связанный вид и отклик представления без тесного соединения (возможно, замените последнюю дату в запросе датой, отправленной пользователем для проверки в сравнении в следующем запросе, не дожидаясь, пока клиент отправит последнюю дату в своей таблице, которая явно совпадает) и будет в списке глобальной функции для следующего пользователя check. while вышел из системы или закройте браузер.

но я действительно не знаю, как это реализовать.

РЕДАКТИРОВАТЬ 1:

Я нашел это HTTP_Push_Module но нет примера для Django и как реализовать глобальную функцию для моей цели

РЕДАКТИРОВАТЬ 2:

Я думаю, что лучше сделать небольшую часть этого вопроса.

вопрос 1:

Как создать что-то вроде этого: ссылка ?

но используйте Django вместо php.

github.com / slact / nginx_http_push_module / BLOB / Master / тесты / test.py

и выше небольшой пример с чистым питоном. (Я не могу понять это)

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

1 Ответ

2 голосов
/ 07 августа 2011

Да, ладно, послушайте: было немного сложно следить за вашим ответом (поэтому, если я что-то упустил, вы могли бы уточнить ваш язык), но: я думаю, что я понимаю, что вы делаете,

Если вы всегда имеете дело с последними 10 сообщениями (или действительно с последними N сообщениями, где в этом случае N = 10), вы можете найти Redis подходящим вариантом.Я настроил длинный опрос, чтобы предоставить статус рабочего очереди виджету интерфейса через WebSockets - моим приложением было приложение Django (работающее на gunicorn, запущенном nginx), но я добавил крошечный класс торнадо для этого рабочего потока иего интерфейс статуса WebSocket без проблем.

Функция статуса должна была сравнить последние N значений;поскольку я использовал структуры данных Redis для очереди, сравнение с клиентом-клиентом WebSocket было проще - я имел такую ​​роскошь, поскольку поведение, которое зависело от сравнения, было только состоянием пользовательского интерфейса, а не обновлением данныхили логику приложения, которая, как я полагаю, вас беспокоит из-за чего-то подобного.

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

Дайте мне знать, если это полезно.

...