3

我有一个烧瓶应用程序,它需要将一些方法作为后台任务运行。我一直在尝试使用 apscheduler。不需要 app_context 的后台任务可以毫无问题地运行,但是,需要它的任务总是会抛出错误:

RuntimeError: Working outside of application context.

我尝试了各种选择。1. 我已将 app 传入作业,并将所有作业更改为接受 app 作为参数。

我试图强制后台任务使用以下内容启动应用程序:

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

这两个选项似乎都没有设法获得 app_context。还有其他方法可以强制后台任务拥有 app_context 吗?

4

1 回答 1

0

您可能已经想通了,但这是我的方法。我想给你什么是你的

在全局上下文中创建应用程序

#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')
于 2020-05-31T22:50:55.310 回答