2016-12-13 7 views
2

Я пытаюсь сделать управление событиями ZeroMQ PUSH-PULL в Django. На основании this link, я буду создавать клиент PUSH как:Zeromq PUSH/PULL в Django

context = zmq.Context() 
zmq_socket = context.socket(zmq.PUSH) 
zmq_socket.connect("tcp://127.0.0.1:5557") 
for num in xrange(20000): 
    work_message = { 'num' : num } 
    zmq_socket.send_json(work_message) 

и сервер PULL как:

context = zmq.Context() 
consumer_receiver = context.socket(zmq.PULL) 
consumer_receiver.bind("tcp://127.0.0.1:5557") 
work = consumer_receiver.recv_json() 
data = work['num'] 
print data 

Реализация PUSH/PULL в отдельном файле прекрасно работает. Но я хочу, чтобы функциональность сервера PULL отображалась в Django. То есть, всякий раз, когда получено сообщение, я хочу, чтобы он был получен в Django, и я могу управлять Django ORM. Как я могу справиться с этим? Благодарю.

+0

Не уверен, что вы просите .. У вас хотите знать, как включить Django в свой скрипт, чтобы вы могли использовать ORM? – FeedTheWeb

ответ

1

Не уверен, что если вы спрашиваете, как включить Django в скрипт, который использует ZMQ, но вот как я это делаю (используя virtualenv)

#!/usr/bin/python2.7 
import sys 
import os 

PATH=os.path.abspath(os.path.dirname(__file__)) 

# Relative path to the virtual environment 
# (relative to the stand-alone script) 
rel_path = '../../bin/activate_this.py' 
activate_this = os.path.join(PATH, rel_path) 
# this is needed to read the settings: 
sys.path.append("../") 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mainapp.settings") 
execfile(activate_this, dict(__file__=activate_this)) 

import zmq 
import json 
from django.conf import settings 
import django 
django.setup() 
from .models import Mymodel 

port = "5556" 
context = zmq.Context() 
print "Connecting to server..." 
socket = context.socket(zmq.REQ) 
socket.connect ("tcp://localhost:%s" % port) 

while True: 
    #this will listen and wait for a message 
    mymessage = json.loads(socket.recv()) 

    try: 
     #do stuff 
     my = Mymodel.objects.get(id=mymessage['id']) 

     #send something back 
     socket.send("1")    
    except: 
     #on error 
     socket.send("0") 
+0

Я хотел же, но в реальных представлениях django; без цикла while. – Pant

+0

@ Пант, ему нужна постоянно работающая программа где-то (демон). иначе он не сможет открыть порт и прослушать. – FeedTheWeb