Как вы планируете синхронизировать события в Flask?

Вот какой код:

from flask import Flask, request import time, threading class MyServer(Flask): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.reset() def reset(self): self.string = "hello" application = MyServer(__name__) @application.route("/set") def set(): application.string = request.args["string"] threading.Timer(10, application.reset()).start() return request.args["string"] + " stored for 10 seconds" @application.route("/get") def get(): return application.string if __name__ == "__main__": application.debug = True application.run() 

Мое ожидание / цель состоит в том, что если вы посещаете конечную точку /set?string=foo то в течение следующих 10 секунд приложение вернет «foo» в любое время, когда вы посетите /get , и с этого момента он вернет «привет», пока вы не нажмете /set endpoint снова.

Вместо этого, если я ударил /set?string=foo а затем сразу же «/ get», приложение вернет «привет», и я вижу, что «TypeError: объект« NoneType »не может быть вызван» в консоли. Может ли кто-нибудь помочь?

One Solution collect form web for “Как вы планируете синхронизировать события в Flask?”

Неправильно указано следующее:

 threading.Timer(10, application.reset()).start() 

Второй аргумент Timer должен быть функцией, но вы фактически вызываете функцию reset () и, таким образом, передаете результат этого вызова метода Timer. Это как если бы вы сделали следующее …

 result = application.reset() threading.Timer(10, result).start() 

Вместо этого вы, скорее всего, захотите сделать следующее:

 threading.Timer(10, application.reset).start() 

При этом я бы очень не решался использовать это решение для чего-то большего, чем игрушечный проект: в зависимости от того, как развертывается приложение Flask, на самом деле вы можете запустить несколько процессов Flask одновременно. В этом случае это решение изменит только процесс, к которому вы в данный момент обращаетесь. Кроме того, появление нового потока в каждом запросе может вызвать довольно много накладных расходов в зависимости от вашей нагрузки.

Лучшим подходом может быть сохранение этих данных в сеансе пользователя (cookie) или в базе данных. Вы можете использовать систему, такую ​​как Celery, или другую очередь сообщений для запуска асинхронного кода.

Если вам нужно, чтобы данные «истекали» через определенное время, также подумайте о том, чтобы установить дату истечения срока действия данных, а затем ввести код, который проверяет истечение срока действия. Таким образом, ваш метод «set» может синхронно устанавливать время истечения срока действия, а конечная точка «get» может проверить, истекло ли время истечения срока действия, и выбрать, какое значение будет возвращаться на основе этого. Теперь вам не нужен асинхронный вызов.

Python - лучший язык программирования в мире.