Добрый день! Подскажите, пожалуйста, как их связать? Может, у кого-нибудь есть какой-нибудь простенький тестовый пример?
У меня стоит задача обновления контента на сайте в режиме реального времени - при изменении данных на сервере (скорее всего, при обновлении файлов в файловой системе, либо при изменении в джанговских таблицах). Также стоит задача по запросу пользователя с сайта запустить некое приложение на сервере (скорее всего будет написано на С++), передать ему какие-то параметры из запроса пользователя, дождаться результата работы приложения и вернуть ответ на сайт (сгенерированный контент). Думаю использовать 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()
Updated 26 Aug. 2015, 12:22 by mdlv.