首先关闭一些背景。
我正在尝试编写一个基于flask-appbuilder的简单Web服务器。 此应用程序将打开一个Socket TCP连接,并且应该接受未定义数量的请求。
当有人与套接字连接时(假设使用telnet),将能够发送他的用户名,并且套接字将检查用户是否在数据库上处于活动状态并返回该值。
为了开始,我开始寻找一些现有的解决方案,我找到了这个Simple Network UDP Listen in Flask or Pyramid 它基于UDP套接字,但概念非常相似。
应用程序运行时,用户可以连接到套接字,但每当他们发送用户时,返回的值不是数据库设置的值(启用或禁用),我无法理解为什么
Web应用程序ui正在对数据库更改做出正确反应。 但是来自socket的sql查询似乎返回了某种旧的(陈旧的)数据,而不是从数据库中获取新的数据。
我在这里添加一些参考代码,也许我做了一些愚蠢的错误。
以下是我如何初始化Celery:
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()
感谢有能力帮助我解决这个问题的人。 干杯。 升。
答案 0 :(得分:0)
db.session.commit()
在进行查询之前。 有没有人能够解释这种行为? 干杯。 升。