2017-02-20 5 views
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()はまだ古い情報を取得します。どうしてか分かりません?

+0

まず、問題は 'current_app'だと思います。' current_app'はスナップショットのようなものだと思うので、このコンテキストをプッシュすると、スレッドは不変のデータベーステーブルを取得します。ただし、ホスト表から行を追加または削除した後、スレッドはこれらの行を削除または追加してホスト表に問い合せます。しかし、私は行を更新し、スレッドはまだ古い行の情報を取得する、これは混乱しています。 – buweilv

答えて

1

@miguelgrinbergにありがとうございました。バックグラウンドスレッドは古いセッションを使用するだけなので、スレッドごとにキャッシュされたセッションが得られます。したがって、while Trueループの最後にdb.session.remove()を追加すると、各反復でクリーンセッションが開始されます。

関連する問題