Форум сайта python.su
Добрый день! Подскажите, пожалуйста, как их связать? Может, у кого-нибудь есть какой-нибудь простенький тестовый пример?
У меня стоит задача обновления контента на сайте в режиме реального времени - при изменении данных на сервере (скорее всего, при обновлении файлов в файловой системе, либо при изменении в джанговских таблицах). Также стоит задача по запросу пользователя с сайта запустить некое приложение на сервере (скорее всего будет написано на С++), передать ему какие-то параметры из запроса пользователя, дождаться результата работы приложения и вернуть ответ на сайт (сгенерированный контент). Думаю использовать 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()
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()
import zmq context = zmq.Context() socket = context.socket(zmq.PUB) socket.connect("XXX") socket.send("your message") socket.close()
Офлайн
Думаю использовать WebSocketZeroMQ-то тут причем?
Офлайн
s0rgВ статье по ссылке по нему связаны друг с другом REST api на Django и сервер веб-сокетов на Tornado.
ZeroMQ-то тут причем?
mdlvЭто у них пример посылки сообщения, подобное надо делать после события в Django которое может заинтересовать Tornado.
import zmq
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.connect(“XXX”)
socket.send(“your message”)
socket.close()
Офлайн