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

Non-Message Queue/Simple Long-Polling в Python (и фляже)

Я ищу простой (т.е. не тот, который требует от меня настроить отдельный сервер для обработки очереди сообщений), чтобы делать длинный опрос для небольшого веб-интерфейса, который выполняет вычисления и создает график. Это то, что должен сделать мой веб-интерфейс:

  • Пользователь запрашивает график/данные в веб-интерфейсе
  • Сервер выполняет некоторые вычисления.
  • Пока на сервере выполняются вычисления, небольшой контейнер обновляется (вероятно, через AJAX/jQuery) с расчетом прогресса (аналогично тому, что вы делали бы в консоли с печатью (т.е. печатать "вычисление функции плотности..." ) ))
  • Окончание вычислений и график отображаются пользователю.

Поскольку расчет все делается на стороне сервера, я не уверен, как легко это установить. Очевидно, я хочу настроить REST API для обработки опроса, что было бы легко в Flask. Однако я не уверен, как получить фактические обновления. Очевидной, хотя и сложной для этой цели, было бы решение настроить очередь сообщений и сделать длинный опрос. Однако я не уверен, что это правильный подход для чего-то такого простого.

Вот мои вопросы:

  • Есть ли способ сделать это с помощью файловой системы? Производительность не является большой проблемой. Может ли AJAX/jQuery найти сообщения из файла? Сохранить прогресс в файле .json?
  • Как насчет травления? (Я не очень много знаю о травлении, но, возможно, я мог бы рассортировать сообщение dict, и это может быть прочитано API, который обрабатывает опрос).
  • Является ли опрос даже правильным? Есть ли лучший или более общий шаблон для этого?

У меня такое чувство, что я преувеличиваю вещи, поскольку я знаю, что подобные вещи распространены в Интернете. Довольно часто я вижу, что что-то происходит, и небольшое изображение "loading.gif" работает во время выполнения некоторых вычислений (например, в Google Analytics).

Спасибо за вашу помощь!

4b9b3361

Ответ 1

Я создал несколько таких приложений, используя только Flask и jQuery. Основываясь на этом опыте, я бы сказал, что ваш план хорош.

  • Не используйте файловую систему.. Вы столкнетесь с проблемами безопасности/защитой JavaScript. В маловероятном случае вы найдете разумные обходные пути, вы все равно не будете иметь ничего портативного или масштабируемого. Вместо этого используйте небольшую локальную веб-службу, например Flask.

  • Не рассосайтесь. Используйте JSON. Это язык веб-приложений и интерфейсов REST. jQuery и те симпатичные плагины, основанные на jQuery для рисования диаграмм, графиков и т.д., ожидают JSON. Он прост в использовании, удобен для восприятия человеком и для небольших приложений, поэтому нет причин идти в другое место.

  • Длительный опрос отлично подходит для того, что вы хотите выполнить. Чистые приложения на основе HTTP имеют некоторые ограничения. И WebSockets и подобные сокет-иш-слои, такие как Socket.IO, - это будущее. Но найти хорошие, простые примеры серверной реализации, по моему опыту, было трудно. Я посмотрел тяжело. Существует множество примеров, которые вы хотите настроить Node.js, REDIS и другие компоненты промежуточного программного обеспечения. Но зачем нам устанавливать два или три отдельных промежуточных сервера? Это смешно. Таким образом, длительный опрос на простой, чистой-Python веб-фреймворке, такой как Flask, является способом выхода IMO.

Код немного больше, чем фрагмент, поэтому вместо того, чтобы включать его здесь, я привел упрощенный пример в репозиторий Mercurial на битбакет чтобы вы могли свободно просматривать, копировать или клонировать. Есть три части:

  • serve.py сервер на основе Python/Flask
  • templates/index.html 98% HTML, 2% -ный файл шаблонов, созданный на основе флагов, будет отображаться как HTML
  • static/lpoll.js клиент на основе jQuery

Ответ 2

Длительный опрос был разумной практикой, прежде чем простая, естественная поддержка веб-сокетов появилась в большинстве браузеров, и до того, как она была легко интегрирована вместе с приложениями Flask. Но здесь, в середине 2013 года, поддержка Web Socket прошла долгий путь.

Вот пример, аналогичный приведенному выше, но включающий Flask и Web Sockets. Он запускается поверх серверных компонентов из gevent и gevent-websocket.

Примечание. Этот пример не является шедевром веб-гнезда. Он сохраняет много структуры lpoll, чтобы сделать их более легко сопоставимыми. Но это сразу улучшает отзывчивость, накладные расходы сервера и интерактивность веб-приложения.