Вы пытаетесь добавить расширенную логику к простой переменной: вы хотите сделать запрос к БД только один раз и периодически принудительно обновлять переменную, перезагружая модуль. Это не то, как модули и механизм импорта должны использоваться.
Если вы хотите получить доступ к изменяющемуся значению из базы данных, вы должны читать его снова и снова.
Решение состоит в том, чтобы вместо переменной определить функцию opening_hours
, которая выполняет запрос к БД каждый раз, когда вы проверяете значение
def opening_hours():
return (
db_session.query(Table.column).one()[0], # 10:00 AM
db_session.query(Table.column).one()[1] # 5:00 PM
)
Теперь вам может не потребоваться запрашивать базу данных каждый раз, когда вы проверяете значение, но, возможно, кэшируйте ее на несколько минут. Для этого проще всего использовать cachetools
:
import cachetools
cache = cachetools.TTLCache(maxsize=10, ttl=60) # Cache for 60 seconds
@cachetools.cached(cache)
def opening_hours():
return (
db_session.query(Table.column).one()[0], # 10:00 AM
db_session.query(Table.column).one()[1] # 5:00 PM
)
Кроме того, поскольку вы используете Flask, вы можете создать декоратор маршрута, который контролирует доступ к вашим представлениям в зависимости от вида дня
from datetime import datetime, time
from functools import wraps
from flask import g, request, render_template
def only_within_office_hours(f):
@wraps(f)
def decorated_function(*args, **kwargs):
start_time, stop_time = opening_hour()
if start_time <= datetime.now().time() <= stop_time:
return render_template('office_hours_error.html')
return f(*args, **kwargs)
return decorated_function
, который вы можете использовать как
@app.route('/secret_page')
@login_required
@only_within_office_hours
def secret_page():
pass