使用Flask-SQLAlchemy Event API向Flask-SocketIO广播?

时间:2014-06-02 20:01:23

标签: python angularjs flask socket.io flask-sqlalchemy

我是一个新手,开发一个简单的多用户游戏(想想Minesweeper),使用Flask作为API后端,使用AngularJS作为前端。我已经按照教程来构建Angular / Flask应用程序,并且我使用Flask-Restless编写了一个RESTful API。

现在,我想在数据库中更改游戏数据时将事件推送给所有客户端(因为它是通过POST到一个Restless端点)。我正在使用SqlAlchemy event.listen API来调用Flask-SocketIO emit function来向客户端广播数据。这是完成我正在尝试做的事情的合适方法吗?这种方法有缺点吗?

2 个答案:

答案 0 :(得分:2)

如果你的所有计算都是在同一个过程中完成的话,那么@ CESCO的回复非常有用。您也可以使用此语法(see full source code here):

@sa.models_committed.connect_via(app)
def on_models_committed(sender, changes):
    for obj, change in changes:
        print 'SQLALCHEMY - %s %s' % (change, obj)

如果您有兴趣订阅数据库的所有更新,请继续阅读...

但是,如果您的数据库是从另一个进程更新的,则无法正常工作。

  

models_committed只能在提交来自的同一进程中工作(它不是数据库级别的通知,在提交到数据库之后是sqlalchemy)

     

https://github.com/mitsuhiko/flask-sqlalchemy/issues/369#issuecomment-170272020

我写了a little demo app,展示了如何使用Redis,ZeroMQ或socketIO_client中的任何一个来与服务器进行实时更新。尝试处理外部数据库访问的其他人可能会有所帮助。

此外,您可以查看订阅postgres事件: https://blog.andyet.com/2015/04/06/postgres-pubsub-with-json/

答案 1 :(得分:1)

这就是你想要的代码的准系统版本。我会从那里开始测试。您必须弄清楚更改的含义,因此您可以将正确的SqlAlchemy事件转移到您正在进行的更改类型。

用户数据库在内容后监听事件

from sqlalchemy import event   
from app import socketio

def after_insert_listener(mapper, connection, target):
    socketio.emit('namespace response',{'data': data[0]},
                  namespace='/namespace')
    print(target.id_user)

event.listen(User, 'after_insert', after_insert_listener)

SocketIO