【问题标题】:Stale data from TCP Socket worker来自 TCP Socket worker 的陈旧数据
【发布时间】:2016-08-04 14:09:52
【问题描述】:

首先介绍一些背景。

我正在尝试基于flask-appbuilder 编写一个简单的Web 服务器。 此应用程序将打开一个 Socket TCP 连接,并且应该接受未定义数量的请求。

当有人连接到套接字时(比如说使用 telnet),将能够发送他的用户名,并且套接字将检查用户是否在数据库上处于活动状态并返回此值。

为了开始它,我开始寻找一些现有的解决方案,我找到了这个Simple Network UDP Listen in Flask or Pyramid 它基于 UDP 套接字,但概念非常相似。

应用程序运行,用户可以连接到套接字,但是每当他们发送用户时,返回的值不是数据库设置的值(启用或禁用),我无法理解为什么。

Web 应用程序 ui 对数据库更改做出正确反应。 但是使用套接字的 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()

感谢任何能够帮助我解决此问题的人。 干杯。 L.

【问题讨论】:

    标签: sockets tcp celery flask-sqlalchemy flask-appbuilder


    【解决方案1】:

    好吧,看来这一切都归结为:

    db.session.commit()
    

    在进行查询之前。 有没有人能够解释这种行为? 干杯。 L.

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 2011-08-09
      • 2014-11-22
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 2019-01-23
      相关资源
      最近更新 更多