0
リアルタイムのデータベース情報をクライアントにプッシュするために、websocketを使用してすべてのリアルタイムデータベース情報をクライアントにプッシュすることによって、サーバー側でflask-socketioを使用します。なぜフラスコのバックグラウンドスレッドが間違ったデータベース情報を取得するのですか?
私のビューファイルの抜粋があります:
from ..models import Host
from flask_socketio import emit, disconnect
from threading import Thread
thread = None
def background_thread(app=None):
"""
send host status information to client
"""
with app.app_context():
while True:
# update host info interval
socketio.sleep(app.config['HOST_UPDATE_INTERVAL'])
# socketio.sleep(5)
all_hosts = dict([(host.id, host.status) for host in Host.query.all()])
socketio.emit('update_host', all_hosts, namespace='/hostinfo')
@main.route('/', methods=['GET', 'POST'])
def index():
all_hosts = Host.query.all()
return render_template('dashboard.html', hosts=all_hosts, async_mode=socketio.async_mode)
@socketio.on('connect', namespace='/hostinfo')
def on_connect():
global thread
if thread is None:
app = current_app._get_current_object()
thread = socketio.start_background_task(target=background_thread, app=app)
emit('my_response', {'data': 'conncted'})
@socketio.on('disconnect', namespace='/hostinfo')
def on_disconnect():
print 'Client disconnected...', request.sid
@socketio.on('my_ping', namespace="/hostinfo")
def ping_pong():
emit('my_pong')
は、私は私のデータベースHost table
を更新するときしかし、Host.query.all()
はまだ古い情報を取得します。どうしてか分かりません?
まず、問題は 'current_app'だと思います。' current_app'はスナップショットのようなものだと思うので、このコンテキストをプッシュすると、スレッドは不変のデータベーステーブルを取得します。ただし、ホスト表から行を追加または削除した後、スレッドはこれらの行を削除または追加してホスト表に問い合せます。しかし、私は行を更新し、スレッドはまだ古い行の情報を取得する、これは混乱しています。 – buweilv