从外部事件触发Flask中的WebSocket

时间:2014-02-16 21:28:59

标签: python websocket flask

有没有办法根据外部事件触发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

1 个答案:

答案 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信号提升给所有工作人员而不是第一个可用的工作人员)