PushMe документация

Содержание:

Tutorial

PushMe - комплекс отправки сообщений с сервера в браузер. Состоит из:

  • Socket клиент-сервер SockJS-Tornado

  • Очередь передачи сообщений из Web-сервера в Socket-сервер. Очередью может выступать:

    • SnakeMQ - pure-python реализация очереди. Хорошо подходит для разработки.
  • API для добавления сообщений в очередь. Может использоваться в:

    • actions/views Web-сервера
    • задачах Celery
    • различных скриптах

Установка

Всё как обычно:

pip install pushme

Использование

Настройка Tornado и очереди сообщений

Сервер Tornado запускается командой:

python -m pushme.server [options]

Сервер очереди сообщений запускается командой:

python -m pushme.queue [options]

Опции можно посмотреть как обычно - указав ключ --help.

--mq-host/--mq-port для торнадо, это хост и порт очереди сообщений.

Если ничего не указывать ни для того, ни для другого сервера, то очередь запустится на localhost:4000, оттуда же будет получать сообщения Tornado и туде же нужно будет посылать сообшения из API, сам же Tornado будет слушать запросы от браузеров на localhost:9999.

Настройка сервера приложений

В основном шаблоне добавляется статика:

<!-- sockJS -->
<script type='text/javascript' src='{{ STATIC_URL }}sockjs-0.3.min.js'></script>
<script type='text/javascript' src='{{ STATIC_URL }}pushme.js'></script>

Где-нибудь в обработчике загрузки страницы создаётся соединение:

Ext.onReady(function(){
    ...
    //
    pushMeConnection.connect(
        'http://localhost', // хост, на котором запущен Tornado
        9999,               // порт, который слушает Tornado
        123                 // id текущего пользователя
    );
});

id пользователя нужен для отправки этому пользователю сообщений, и должен быть уникатьным!

В проекте в settings.INSTALLED_APPS добавляется приложение:

'pushme',

Использование API

На сервере:

from pushme.mq import get_sender
sender = get_sender(
    'snakemq',           # backend очереди сообщений
    ('localhost', 4000)  # сокет очереди сообщений
)
sender.send(
    data='Hello!',       # собственно, сообщение
    uid=123,             # uid пользователя, None для сообщения всем
    topic='ping'         # topic сообщения (м.б. None)
)

На клиентской стороне:

// подписка на сообщения
var callbackId = pushMeConnection.subscribe(
    function(msg) {
        console.log(msg);
    },
    'ping'  // topic, по которому будут фильтроваться соощения
);
...
// отписка от сообщений
pushMeConnection.unsubscribe(callbackId);

Если topic для подписчика не указан, то подписчик будет получать все сообщения. Все подписчики получают topic вторым параметром. Пример подписчка, получающего все сообщения:

var fanout = pushMeConnection.subscribe(
    function(msg, topic) {
        console.log(topic, ':', msg);
    }};

API Reference

pushme package

Subpackages

pushme.demo package
Submodules
pushme.demo.actions module
class pushme.demo.actions.Pack[исходный код]

Базовые классы: objectpack.actions.BasePack

add_to_desktop = True
get_default_action()[исходный код]
title = u'PushMe'
class pushme.demo.actions.SendAction[исходный код]

Базовые классы: objectpack.actions.BaseAction

run(request, context)[исходный код]
class pushme.demo.actions.WindowAction[исходный код]

Базовые классы: objectpack.actions.BaseWindowAction

create_window()[исходный код]
set_window_params()[исходный код]
pushme.demo.app_meta module
pushme.demo.app_meta.register_actions()[исходный код]
pushme.demo.ui module
class pushme.demo.ui.MsgWindow[исходный код]

Базовые классы: objectpack.ui.BaseWindow

set_params(params)[исходный код]
Module contents
pushme.mq package
Submodules
pushme.mq.backend_snakemq module

Очередь на базе snakeMQ. Подходит для использования на машинах разработчиков, т.к. является pure-python.

class pushme.mq.backend_snakemq.Queue(*args, **kwargs)[исходный код]

Базовые классы: pushme.mq.interface.Queue

Простой сервер очереди на ОДНОГО получателя и несколько отправителей

run()[исходный код]
class pushme.mq.backend_snakemq.Receiver(*args, **kwargs)[исходный код]

Базовые классы: pushme.mq.interface.Receiver

Простой получатель. В данной реализации очереди может быть ТОЛЬКО ОДИН получатель!

loop_timeout = 0.1
process()[исходный код]
class pushme.mq.backend_snakemq.Sender(*args, **kwargs)[исходный код]

Базовые классы: pushme.mq.interface.Sender

Простой отправитель.

loop_len = 2
loop_timeout = 0.02
msg_ttl = 500
send(data, uid=None, topic=None)[исходный код]

Отправляет сообщение получателю посредством очереди :uid :: int - id socket-соединения :topic - тема сообщения :data - данные для отправки

pushme.mq.interface module

Базовые классы для queue backends

class pushme.mq.interface.Queue(addr, quiet=False)[исходный код]

Базовые классы: object

Сервер очереди

run()[исходный код]
class pushme.mq.interface.Receiver(ident, queue_addr, quiet=False)[исходный код]

Базовые классы: pushme.mq.interface._Client

Клиент-получатель

static callback(uid, topic, data)

Умолчательный обработчик получения сообщений

process()[исходный код]

Производит получение сообщений (это callback для асинхронного ядра tornado)

class pushme.mq.interface.Sender(ident, queue_addr, quiet=False)[исходный код]

Базовые классы: pushme.mq.interface._Client

Клиент-отправитель

send(data, uid=None, topic=None)[исходный код]

Отправляет сообщение получателю посредством очереди :uid :: int - id socket-соединения :topic - тема сообщения :data - данные для отправки

Module contents

Очередь сообщений. Предоставляет единый интерфейс для различных реализаций очередей.

pushme.mq.get_queue(backend, *args, **kwargs)[исходный код]

Возвращает реализацию сервера очереди :backend - имя конкретной реализации очереди

pushme.mq.get_receiver(backend, *args, **kwargs)[исходный код]

Возвращает реализацию клиента - получателя сообщений :backend - имя конкретной реализации очереди

pushme.mq.get_sender(backend, *args, **kwargs)[исходный код]

Возвращает реализацию клиента - отправителя сообщений :backend - имя конкретной реализации очереди

Submodules

pushme.client module

CLI-программа, демонстрирующая API отправки сообщений

pushme.options module

Подсистема наcтройки компонент через ком.строку

pushme.options.configure(prog, options, **defaults)[исходный код]

Возвращает парсер ключей ком.строки для компоненты

pushme.queue module

Сервер очереди сообщений на отправку

pushme.server module

class pushme.server.PushConnection(session)[исходный код]

Базовые классы: sockjs.tornado.conn.SockJSConnection

SockJS-соединение для отправки сообщений в браузер

on_close()[исходный код]
on_message(msg)[исходный код]
on_open(request)[исходный код]
pushme.server.receive_callback(uid, topic, data)[исходный код]

callback, обрабатывающий сообщения из очереди

Module contents

Система отправки сообщений от сервера в браузер