Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Flask SQLAlchemy事件API向Flask SocketIO广播?_Python_Angularjs_Flask_Socket.io_Flask Sqlalchemy - Fatal编程技术网

Python 使用Flask SQLAlchemy事件API向Flask SocketIO广播?

Python 使用Flask SQLAlchemy事件API向Flask SocketIO广播?,python,angularjs,flask,socket.io,flask-sqlalchemy,Python,Angularjs,Flask,Socket.io,Flask Sqlalchemy,我是一个开发一个简单的多用户游戏(比如扫雷者)的新手,使用Flask作为API后端,AngularJS作为前端。我已经按照教程构建了Angular/Flask应用程序,并使用Flask Untivent编写了一个RESTful API 现在,当数据库中的游戏数据发生更改时,我希望将事件推送到所有客户端(就像通过向不安端点之一发送帖子一样)。我正在考虑使用SqlAlchemy调用Flask SocketIO来向客户机广播数据。这是一个合适的方法来完成我想做的事情吗?这种方法有缺点吗?这是您想要的代

我是一个开发一个简单的多用户游戏(比如扫雷者)的新手,使用Flask作为API后端,AngularJS作为前端。我已经按照教程构建了Angular/Flask应用程序,并使用Flask Untivent编写了一个RESTful API


现在,当数据库中的游戏数据发生更改时,我希望将事件推送到所有客户端(就像通过向不安端点之一发送帖子一样)。我正在考虑使用SqlAlchemy调用Flask SocketIO来向客户机广播数据。这是一个合适的方法来完成我想做的事情吗?这种方法有缺点吗?

这是您想要的代码的基本版本。我会从那里开始测试。你必须弄清楚你所说的改变是什么意思,这样你才能根据你正在做的改变的类型来选择正确的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

@CESCO的回复非常有效,如果您的所有计算都是在同一个过程中完成的。您还可以使用以下语法():

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




但是,如果您的数据库是从另一个进程更新的,那么这将不起作用

models_committed仅在提交来自的同一进程中工作(它不是DB级别的通知,而是提交到DB后的sqlalchemy)

我写了一篇文章,展示了如何使用Redis、ZeroMQ或socketIO_客户端与服务器进行实时更新通信。这可能对其他试图处理外部数据库访问的人有所帮助

此外,您还可以考虑订阅postgres活动:

方法很好;你试过什么?有什么失败的吗?
@sa.models_committed.connect_via(app)
def on_models_committed(sender, changes):
    for obj, change in changes:
        print 'SQLALCHEMY - %s %s' % (change, obj)