Как запустить задание apscheduler, для которого требуется app_context

У меня есть фляжное приложение, которому нужно запускать некоторые методы в качестве фоновых задач. Я пытался использовать apscheduler. Фоновые задачи, которые не требуют app_context, выполняются без проблем, однако задачи, которые требуют этого, всегда выдают ошибку:

RuntimeError: Working outside of application context.

Я пробовал разные варианты. 1. Я передал приложение в задание и изменил все задания, чтобы они принимали приложение в качестве параметра.

Я попытался заставить фоновую задачу запустить приложение со следующим:

class APScheduler(_BaseAPScheduler):
    def start(self):
        app = create_app()
        apply_config(app)
        with app.app_context():
            super().start()

Оба варианта, похоже, не смогли получить app_context. Есть ли другие способы заставить фоновую задачу иметь app_context?


person Andrew Gill    schedule 01.10.2018    source источник


Ответы (1)


Возможно, вы уже поняли это, но вот мой подход. Я хотел бы, чтобы ты был твоим

В глобальном контексте создайте приложение

#Let BackgroundJobs be A module having all logics of batch jobs
from BackgroundJobs import BatchJobs 
app = Flask(__name__)

def job1():
     with app.app_context():
          BatchJobs.job1()

def job2():
     with app.app_context():
          BatchJobs.job2()



scheduler = BackgroundScheduler()
scheduler.add_job(job1, 'interval', minutes=5)
scheduler.add_job(job2, 'interval', minutes=5)

scheduler.start()
if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=False)


Внутри BackgroundJobs.py вам нужно будет импортировать прокси в приложение, используя ниже. Чтобы приложение было доступно, мы должны вызывать методы в модуле с помощью app.app_conext().

from flask import current_app as app

def job1():
     app.logger.info('Job1')

def job2():
     app.logger.info('Job2')
person Seto Kaiba    schedule 31.05.2020