Как силами flask организовать проверку обновлений в БД по таймеру?

Создал небольшое приложение на flask с БД куда сенсоры на arduino периодически отправляют данные.

Как сделать так, чтобы, например, каждые 20 минут проверять БД на наличие новых записей и если их нет, то отправлять alarm.
Вопросов как организовать alarm или проверку у меня нет (проверяю по времени и если timedelta больше скольких-то минут, отправляю по api в телеграм уведомление).

Подскажите, как организовать таймер в 20 минут?
Cron нет - хотелось бы именно силами этого же приложения flask.

Во views.py создал такую функцию:
def check_alive_Sensors():
    while True:
        TELEGRAM_URL = "https://api.telegram.org/bot"
        part_url_for_1 = "/sendMessage?chat_id="
        chat_id = BaseConfig.CHAT_ID
        part_url_for_2 = "&text="
        text = "Внимание: ОТКЛЮЧЕНИЕ ЭЛЕКТРИЧЕСТВА. ДАТА: "
        BOT_TOKEN = BaseConfig.BOT_TOKEN

        now = datetime.now() + timedelta(hours=3)

        obj1, obj2 = Sensors.query.order_by(Sensors.id.desc()).limit(2)
        print(obj1.date_send)

        delta = obj1.date_send - now
        last_send = obj1.date_send
        delta1 = int(delta.total_seconds() / 60)

        if delta1 > 2:
            text = "Внимание: Долго не было новых данных. Последняя отправка: "
            request_telegram = TELEGRAM_URL + BOT_TOKEN + part_url_for_1 + chat_id + part_url_for_2 + text \
                               + str(last_send) + "мин."
            # return redirect(request_telegram)
            resp = requests.get(request_telegram)
            api_answer = resp.json()
            api_answer_status = api_answer["ok"]
            print(type(api_answer))
            print(type(api_answer_status))

        time.sleep(20)

thread = Thread(target=check_alive_Sensors)
thread.start()


Вылезает следующий Exception:

C:\Users\xabor\PycharmProjects\flask\TODO-app\venv\Scripts\python.exe C:\Users\xabor\PycharmProjects\flask\TODO-app\runner.py 
Exception in thread Thread-1 (check_alive_Sensors):
Traceback (most recent call last):
  File "C:\Program Files\Python311\Lib\threading.py", line 1045, in _bootstrap_inner
    self.run()
  File "C:\Program Files\Python311\Lib\threading.py", line 982, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\xabor\PycharmProjects\flask\TODO-app\app\views.py", line 33, in check_alive_Sensors
    obj1, obj2 = Sensors.query.order_by(Sensors.id.desc()).limit(2)
                 ^^^^^^^^^^^^^
  File "C:\Users\xabor\PycharmProjects\flask\TODO-app\venv\Lib\site-packages\flask_sqlalchemy\model.py", line 31, in __get__
    cls, session=cls.__fsa__.session()  # type: ignore[arg-type]
                 ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\xabor\PycharmProjects\flask\TODO-app\venv\Lib\site-packages\sqlalchemy\orm\scoping.py", line 47, in __call__
    sess = self.registry()
           ^^^^^^^^^^^^^^^
  File "C:\Users\xabor\PycharmProjects\flask\TODO-app\venv\Lib\site-packages\sqlalchemy\util\_collections.py", line 1006, in __call__
    key = self.scopefunc()
          ^^^^^^^^^^^^^^^^
  File "C:\Users\xabor\PycharmProjects\flask\TODO-app\venv\Lib\site-packages\flask_sqlalchemy\session.py", line 102, in _app_ctx_id
    return id(app_ctx._get_current_object())  # type: ignore[attr-defined]
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\xabor\PycharmProjects\flask\TODO-app\venv\Lib\site-packages\werkzeug\local.py", line 508, in _get_current_object
    raise RuntimeError(unbound_message) from None
RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
the current application. To solve this, set up an application context
with app.app_context(). See the documentation for more information.
 * Serving Flask app 'app'
 * Debug mode: off
INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
INFO:werkzeug:Press CTRL+C to quit
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
Cron нет - хотелось бы именно силами этого же приложения flask.
Cron - да, flask это веб сервер, не нужно на него вешать, то что он не должен делать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы