最初にいくつかのバックグラウンドをオフにします。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.