首先關閉一些背景。來自TCP Socket工作人員的陳舊數據
我想寫一個簡單的web服務器,基於flask-appbuilder。 此應用程序將打開Socket 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)
這裏是工人代碼:
@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.