Python/Flasks/Socketio, socketio.emit(...) 不发射
Python/Flasks/Socketio, socketio.emit(...) doesn't emit
我在使用 flasks socketio 时遇到问题,似乎当我调用 socketio.emit('my event', 'my message')
它根本不会发出任何事件...
这是我的设置:
|
+--/static <-- css/js/etc.
|
+--/templates <- only home.html
|
+--flask_app.py
home.html
只是与这些脚本的简单聊天 window,它没有任何问题:
<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://')
现在我可以从另一个控制台更改数据库中的值,每个人都会看到更改
我在使用 flasks socketio 时遇到问题,似乎当我调用 socketio.emit('my event', 'my message')
它根本不会发出任何事件...
这是我的设置:
|
+--/static <-- css/js/etc.
|
+--/templates <- only home.html
|
+--flask_app.py
home.html
只是与这些脚本的简单聊天 window,它没有任何问题:
<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://')
现在我可以从另一个控制台更改数据库中的值,每个人都会看到更改