Flask/Thread. Мне нужно написать параллельную функцию которая будет раз в день чистить просроченные записи в бд
**Мне нужно написать функцию которая будет раз в день чистить просроченные записи в бд
**Проблема состоит в том что SQLAchemy должен видеть app чтобы работать с базой данных, но как мне в мой thread передать переменную app из главной функции,
def threaded_task():
while True:
with app.app_context():
Link.query.filter(Link.expiration_date < date.today()).delete()
time.sleep(86400)
def create_app(config_file='settings.py'):
app = Flask(__name__)
app.config.from_pyfile(config_file)
db.init_app(app)
app.register_blueprint(short)
thread = Thread(target=threaded_task)
thread.daemon = True
thread.start()
return app
Ответы (1 шт):
def threaded_task(app):
...
thread = Thread(target=threaded_task, args=(app,))
Только обратите внимание, что аргументы нужно передавать именно в виде кортежа, поэтому запятая после app обязательна, иначе это будет уже не кортеж.
Но вообще лучше такие задачи вешать на шедулер, вешать задачи, подходящие больше для шедулера, на веб-сервис - совершенно неправильная практика. Веб-сервер по своей природе такая штука, которая может быть в любой момент перезагружена. И у неё ограниченное число рабочих потоков. Вешайте такие задачи лучше на системный шедулер, он должен сработать по расписанию в почти любых обстоятельствах. Он не будет тратить на себя поток и сработает правильно даже если сервер перезагрузят.