使用Flask-SQLAlchemy事件API广播到Flask-SocketIO?

7
我是一个新手,正在开发一个简单的多用户游戏(类似扫雷),后端使用Flask API,前端使用AngularJS。我已经按照教程构建了Angular/Flask应用程序,并使用Flask-Restless编写了RESTful API。现在,当数据库中的游戏数据更改时(通过POST到Restless端点之一实现),我想将事件推送到所有客户端。我考虑使用SqlAlchemy的event.listen API调用Flask-SocketIO的emit function来向客户端广播数据。这种方法能否达到我的目的?是否存在缺陷?

方法没问题,你尝试过什么?有什么失败的地方吗? - GG_Python
2个回答

2

@CESCO的回答对于所有计算都在同一进程中进行的情况非常有效。您还可以使用此语法(在此处查看完整源代码):

@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仅适用于提交来自同一进程的提交(它不是DB级别的通知,而是在提交到DB后使用sqlalchemy)

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

我写了一个小演示应用程序,展示如何使用Redis、ZeroMQ或socketIO_client向服务器实时通信更新。对于其他试图处理外部数据库访问的人可能会有所帮助。

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


1
这是你需要的代码框架,你可以从这里开始测试。你需要弄清楚你所说的“change”是什么意思,这样你才能将正确的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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接