有没有办法根据外部事件触发send()
websocket命令?每次更新数据库时,我都会尝试推送到客户端。我尝试过使用sql notify
,uwsgi文件监视器装饰器等。基本代码是
from flask.ext.uwsgi_websocket import GeventWebSocket
from uwsgidecorators import *
ws = GeventWebSocket(app)
@ws.route('/feed')
def socket(ws):
ws_readystate = ws.receive()
if ws_readystate == '1':
ws.send(json.dumps('this message is received just fine'))
# client is ready, start something to trigger sending a message here
@filemon("../mydb.sqlite")
def db_changed(x):
print 'DB changed'
ws.send(json.dumps('db changed'))
这将在输出中打印“DB changed”,但客户端将不会收到“db changed”消息。我正在运行应用程序
uwsgi --master --http :5000 --http-websockets --gevent 2 --wsgi my_app_name:app
答案 0 :(得分:1)
gevent队列是管理此类模式的好方法
这是一个你可以适应你的情况的例子
from uwsgidecorators import *
from gevent.queue import Queue
channels = []
@filemon('/tmp',target='workers')
def trigger_event(signum):
for channel in channels:
try:
channel.put_nowait(True)
except:
pass
def application(e, sr):
sr('200 OK', [('Content-Type','text/html')])
yield "Hello and wait..."
q = Queue()
channels.append(q)
q.get()
yield "event received, goodbye"
channels.remove(q)
如果您不打算使用多个进程,请随意从filemon装饰器中删除target ='workers'(此特殊目标将uwsgi信号提升给所有工作人员而不是第一个可用的工作人员)