Python/Flasks/Socketio,socketio.emit(...) 不发出

标签 python flask flask-sqlalchemy flask-socketio

我在使用 Flasks socketio 时遇到问题,似乎当我调用 socketio.emit('my event', 'my message') 时它根本不发出任何事件。 ..

这是我的设置:

|
+--/static     <-- css/js/etc.
|
+--/templates  <- only home.html
|
+--flask_app.py

home.html 只是一个带有这些脚本的简单聊天窗口,它可以正常工作:

<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<script type="text/javascript" charset="utf-8">
    var socket = io.connect('http://' + document.domain + ':' + location.port);
    $('form').submit(function(){
        socket.emit('request', $('#m').val());
        $('#m').val('');
        return false;
    });

    socket.on('message', function(message){
        $('#messages').append($('<li>').text(message));
        console.log('Message received');
    });
</script>

我有一个函数可以跟踪模型数据的变化,并发出一个事件 通知大家数据已更改,问题是当我打电话时 socketio.emit(...) 没有人收到通知。

from flask import Flask, render_template
from flask_socketio import SocketIO, emit
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import event

app = Flask(__name__)

# App configuration
app.config['SECRET_KEY'] = 'somekey!'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

socketio = SocketIO(app)

db = SQLAlchemy(app)

# Simple model
class Person(db.Model):


    __tablename__ = 'persons'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

    @property
    def serialize(self):
        return {
            'id': self.id,
            'name': self.name
        }

db.create_all()

@app.route('/')
def index():
    return render_template('home.html')

# Whenever a user emits 'request' event via javascripts socketio
@socketio.on('request')
def handle_request(message):
    emit('message', str(message), broadcast=True)

# Whenever values are changed in Persons table
@event.listens_for(Person, 'after_update')
def receive_after_update(mapper, connection, target):
    print(str(target.serialize))
    socketio.emit('message', str(target.serialize)) # <------ This doesn't emit any event...

if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0', port=8000, debug=True)

有谁知道是什么问题吗? 谢谢

编辑

忘记提及我通过控制台对数据库进行了更改,它打印出 print(str(target.serialize))

最佳答案

找到解决方案

首先我必须安装redis

pip install redis

那么我应该更改这一行:

socketio = SocketIO(app)

对此:

socketio = SocketIO(app, message_queue='redis://')

现在,我可以从另一个控制台更改数据库中的值,每个人都会看到更改

关于Python/Flasks/Socketio,socketio.emit(...) 不发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44516484/

相关文章:

python - 部署 Bottle Web 应用程序

python - 如何使用 Flask 返回相对 URI Location header ?

python - 使用 pytest 在 Flask 中测试服务器发送的事件

python - Flask-SQLalchemy - 从子类中的父类获取关系参数

python - 为什么这个 python while 循环缺少逻辑运算符?

python - 用 None 替换 Pandas 或 Numpy Nan 以与 MysqlDB 一起使用

python - Heroku Node.js + Python

flask - 如何在gunicorn中运行打包为pex的flask应用程序?

python - 使用 Flask-SQLAlchemy 反射(reflect)表引发 RuntimeError : application not registered

python - 从 flask-reSTLess 返回自定义属性