Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 26, 2015 13:00:32

mdlv
Зарегистрирован: 2015-07-31
Сообщения: 15
Репутация: +  0  -
Профиль  

Django + ZeroMQ

Добрый день! Подскажите, пожалуйста, как их связать? Может, у кого-нибудь есть какой-нибудь простенький тестовый пример?
У меня стоит задача обновления контента на сайте в режиме реального времени - при изменении данных на сервере (скорее всего, при обновлении файлов в файловой системе, либо при изменении в джанговских таблицах). Также стоит задача по запросу пользователя с сайта запустить некое приложение на сервере (скорее всего будет написано на С++), передать ему какие-то параметры из запроса пользователя, дождаться результата работы приложения и вернуть ответ на сайт (сгенерированный контент). Думаю использовать WebSocket (sockjs + ZeroMQ).

Итого: есть сайт на django, стоит apache2 + mod_wsgi, они работают все трое в связке, django установлен в виртуальном окружении (virtualenv). Установил на сервере в виртуальном окружении pyzmq, python-zmq, libzmq-dev. Установил также sockjs-tornado. В шаблоне, предположим, подключаю скачанную библиотеку sockjs в виде *.js, только какую именно? sockjs-client? Дальше еще больше сомневаюсь, что правильно делаю (на основе этого поста http://habrahabr.ru/post/181037/ ): В нужном джанговском приложении создал папку /management/commands/ В каждую папку кинул пустой init.py. В /management/commands/ создал файлы zmq_server.py

import zmq
def main():
    try:
        context = zmq.Context(1)
        # Socket facing clients
        frontend = context.socket(zmq.SUB)
        frontend.bind("tcp://127.0.0.1:XXXX")
        frontend.setsockopt(zmq.SUBSCRIBE, "")
        # Socket facing services
        backend = context.socket(zmq.PUB)
        backend.bind("tcp://127.0.0.1:YYYY")
        zmq.device(zmq.FORWARDER, frontend, backend)
    except Exception, e:
        # Handle exception
        pass
    finally:
        frontend.close()
        backend.close()
        context.term()
if __name__ == '__main__':
    main()

tornado_server.py

from sockjs.tornado import SockJSConnection, SockJSRouter
from tornado import ioloop as tornado_ioloop, web
import zmq
from zmq.eventloop import ioloop
from zmq.eventloop.zmqstream import ZMQStream
ioloop.install()
io_loop = tornado_ioloop.IOLoop.instance()
class SyncConnection(SockJSConnection):
    _connected = set()
    stream = None
    def __init__(self, session):
        super(SyncConnection, self).__init__(session)
        self.stream.on_recv(self.on_server_message)
    def on_open(self, request):
        self._connected.add(self)
    def on_message(self, data):
        pass
    def on_server_message(self, data):
        message = "your message"
        self.broadcast(self._connected, {'message': message})
    def on_close(self):
        self._connected.remove(self)
class SockJSMyRouter(SockJSRouter):
    def __init__(self, *args, **kw):
        super(SockJSMyRouter, self).__init__(*args, **kw)
        socket = context.socket(zmq.SUB)
        socket.setsockopt(zmq.SUBSCRIBE, "")
        socket.connect("tcp://127.0.0.1:YYYY")
        self._connection.stream = ZMQStream(socket, self.io_loop)
if __name__ == '__main__':
    context = zmq.Context()
    EchoRouter = SockJSMyRouter(SyncConnection, '/echo')
    app = web.Application(EchoRouter.urls)
    app.listen("ZZZZ")
    io_loop.start()

Если я правильно понимаю, необходимо запустить через python manage.py оба этих скрипта параллельно? И какие порты лучше использовать?

Куда нужно добавить вот эти строки для Django-сервера?

import zmq
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.connect("XXX")
socket.send("your message")
socket.close()

Офлайн

#2 Авг. 26, 2015 18:02:38

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Django + ZeroMQ

Думаю использовать WebSocket
ZeroMQ-то тут причем?

Офлайн

#3 Авг. 27, 2015 09:30:53

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Django + ZeroMQ

s0rg
ZeroMQ-то тут причем?
В статье по ссылке по нему связаны друг с другом REST api на Django и сервер веб-сокетов на Tornado.
mdlv
import zmq
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.connect(“XXX”)
socket.send(“your message”)
socket.close()
Это у них пример посылки сообщения, подобное надо делать после события в Django которое может заинтересовать Tornado.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version