Устаревшие данные от работника TCP Socket

Сначала немного предыстории.

Я пытаюсь написать простой веб-сервер, основанный на flask-appbuilder. Это приложение будет иметь открытое соединение Socket TCP и должно принимать неопределенное количество запросов.

Когда кто-то подключится к сокету (скажем, через telnet), сможет отправить свое имя пользователя, а сокет будет проверять, активен ли пользователь в базе данных и возвращает ему это значение.

Чтобы начать, я начал искать в некоторых существующих решениях и обнаружил одно простое прослушивание UDP по сети в Flask или Pyramid, которое основано на сокете UDP, но концепция очень похожа.

Приложение запускается, пользователи могут подключаться к сокету, но всякий раз, когда они отправляют своего пользователя, возвращаемое значение не соответствует базе данных (включена или отключена), и я не могу понять, почему.

Пользовательский интерфейс веб-приложения корректно реагирует на изменения базы данных. Но 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.

1 ответ

Хорошо, кажется, все сводится к наличию:

db.session.commit()

перед выполнением запроса. Кто-нибудь может объяснить это поведение? Приветствия. L.

Другие вопросы по тегам