2016-08-04 6 views
0

最初にいくつかのバックグラウンドをオフにします。TCPソケット作業員からの古くなったデータ

私はflask-appbuilderに基づいて簡単なWebサーバーを作成しようとしています。 このアプリケーションはソケットTCP接続を開いており、未定義の要求数を受け入れる必要があります。

誰かがソケットに接続すると(telnetを使って)、自分のユーザ名とソケットを送信できるようになり、ユーザがデータベース上でアクティブであるかどうかをチェックし、この値を返します。

私はいくつかの既存のソリューションを調べ始めましたが、これを見つけました。Simple Network UDP Listen in Flask or Pyramid UDPソケットに基づいていますが、コンセプトは非常に似ています。

アプリケーションが実行されると、ユーザーはソケットに接続できますが、ユーザーが送信されるたびに、返される値はデータベースの設定(有効または無効)ではなく、理由を理解できません。

Webアプリケーションuiがデータベースの変更に正しく反応しています。 しかし、ソケットを使用したsqlクエリは、データベースから新しいものをフェッチするのではなく、古い(古い)データを返すようです。

私はここにいくつかの参照コードを追加します、多分私はいくつかの愚かな間違いをしています。

ここ
class FlaskCelery(Celery): 

    def __init__(self, *args, **kwargs): 

     super(FlaskCelery, self).__init__(*args, **kwargs) 
     self.patch_task() 

     if 'app' in kwargs: 
      self.init_app(kwargs['app']) 

    def patch_task(self): 
     TaskBase = self.Task 
     _celery = self 

     class ContextTask(TaskBase): 
      abstract = True 

      def __call__(self, *args, **kwargs): 
       if flask.has_app_context(): 
        return TaskBase.__call__(self, *args, **kwargs) 
       else: 
        with _celery.app.app_context(): 
         return TaskBase.__call__(self, *args, **kwargs) 

     self.Task = ContextTask 

    def init_app(self, app): 
     self.app = app 
     print app.config 
     self.config_from_object(app.config) 

celery = FlaskCelery() 
celery.init_app(app) 

ワーカーコードです::このwiht私を助けることができる誰にでも

@celery.task(name='listen_to_tcp', serializer='json', bind=True) 
def listen_to_tcp(self): 

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    sock.bind(('0.0.0.0', app.config['SOCKET_PORT'])) 
    sock.listen(0) 
    while True: 

     connection, client_address = sock.accept() 

     try: 
      while True: 
       data = connection.recv(1024) 
       data = data.strip() 
       if data: 
        qresult = db.session.query(MyUser).filter_by(username=data).one() 
        connection.sendall(qresult.is_active) 
       else: 
        break 
     finally: 
      connection.close() 

listen_to_tcp.delay() 

おかげでここ

は、私はセロリを初期化しています方法です。 乾杯。それがすべて持つに沸くようだ L.

答えて

0

OK:

db.session.commit() 

クエリを実行する前に。 この動作を説明できる人はいますか? 乾杯。 L.

関連する問題