Подтвердить что ты не робот

Django Push HTTP-ответ пользователям

В настоящее время у меня очень простое веб-приложение, написанное в Django, и я хотел бы реализовать что-то вроде службы обратного вызова/push-уведомления в моем приложении.

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

Я полагаю, что я могу использовать сигналы Django для создания обратного вызова, когда пользователь загружает фотографию, но как мне заставить Django отправлять уведомления другим пользователям? Это уведомление может быть либо предупреждением, либо просто перенаправлять других пользователей на новый html, который отображает загруженное изображение. Я бы предпочел последнее.

Я новичок в веб-программировании, поэтому я не уверен, соответствует ли это законопроекту как "веб-приложение реального времени", которое реализует такие вещи, как комета или длительный опрос. Мое приложение похоже на приложение чата, за исключением того, что я не отправляю текстовые файлы, а файлы изображений. Из-за этого я думал, что кометные решения будут работать. Я пробовал смотреть на Orbited и Twisted в течение очень долгого времени, но не повезло в его реализации с Django, возможно, потому, что я не понимаю, как выполнить то, что я хочу, с помощью кометных решений. Я хотел бы, чтобы более опытные программисты указывали мне, что именно мне нужно для этого, или если я направляюсь в правильном направлении или нет (с комету).

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

4b9b3361

Ответ 1

HTTP по сути является протоколом "выталкивания", т.е. клиент извлекает данные с сервера, ждет некоторое время, а затем извлекает больше данных позже. На самом деле нет строго HTTP-способа "нажимать" данные клиенту с сервера.

У вас есть в основном три варианта, когда вам нужно "нажимать" на клиента.

(1) Делать опрос - использовать Ajax/javascript для опроса сервера каждые X раз. Чем меньше X, тем больше он "чувствует" "толчок", но и больше накладных расходов, которые ваш сервер испытывает, чтобы постоянно реагировать на эти запросы.

(2) Используйте websockets. Часть спецификации HTML5 - это нечто, называемое websockets. Websockets позволяет браузеру открывать постоянное соединение с сервером. Как только это соединение было открыто, данные могут быть отброшены назад и назад от клиента к серверу и серверу клиенту, как и к более традиционным сокетам TCP. Проблема с websockets (последнее, что я слышал) заключалась в том, что они все еще могут быть немного темпераментны между браузерами и, конечно, вообще не работают в старых браузерах.

(3) Используйте Flash с интерфейсом Javascript. Flash имеет возможность настраивать постоянные TCP-соединения, которые могут использоваться для push/pull данных, как при обычном TCP-соединении. (См. Также этот вопрос: HTTP-push-примеры в Flex)


Если вы начинаете этот проект с нуля, я бы порекомендовал вам написать свой сервер в Node.js с Socket.io. Socket.io - это "сокет-подобная" инфраструктура, которую вы можете запрограммировать, а затем клиент Javascript (который работает в вашем веб-браузере) разумно определяет лучшее "постоянное соединение" для использования - сначала он пытается использовать Websockets, затем Flash, затем длительный опрос различных типов.


Но так как вы сказали, что хотите использовать Python/Django, тогда вы должны проверить Django-Websockets - рамки для использования websockets с Django. Но не забудьте прочитать Отказ от ответственности, который автор помещает на страницу, есть некоторые значительные трудности/ограничения, связанные с его использованием, в первую очередь потому, что Django не был разработан с учетом веб-сайтов.

Я думаю, что ваш лучший выбор закончится тем, что использует Websockets с интеллектуальным резервным копированием Ajax-опроса, когда браузер пользователя не поддерживает его.

Ответ 2

Если вы используете nginx, что является хорошим выбором:), вы можете использовать push-модуль http://pushmodule.slact.net/, я нашел его скорее легко использовать. У вас есть один URL-адрес для публикации сообщений на канале (это можно сделать легко на python, например, с помощью httplib) и один URL-адрес для вывода сообщений с канала (и канал может использоваться более чем одним пользователем). См. Также http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/ для интеграции jquery.