背景:需要定时对图片进行目标检测,图片存储在数据库中
其实一开始,这个定时任务已经写好了,但是当时没有这些图片,就拿本地的一些图片去模拟。
当我想当然去操作数据库获取最新图片路径出现了如下问题
执行时报错:RuntimeError: No application found. Either work inside a view function or push an application context
我理解问题原因是操作数据库是需要db,但是此时后台运行的定时任务是找不到app的。
解决办法
1.安装
pip install apscheduler
2.导入
from flask_apscheduler import APScheduler
3.使用
scheduler = APScheduler()
Bee = Yolo7BeeImg()
#设置定时任务--半小时执行一次yolo
@scheduler.task("interval",id="yolo",minutes=3)
def hello():
print('定时器触发器')
#查询最新的图片
sql = '''
select path,MAX(upload_time),fxid from images
GROUP BY fxid
'''
# 提供flask上下文对象
with scheduler.app.app_context():
result = db.session.execute(sql)
result = list(result)
for stock in result:
path = stock[0]
pass
def create_app(dev_name):
"""
返回一个实例化并且配置好数据的一个app
dev_name:选择环境的参数
:return:
"""
app = Flask(__name__)
config_class = config_map.get(dev_name)
app.config.from_object(config_class) # 从类中读取需要的信息
db.init_app(app) # 实例化的数据库 配置信息
# 添加工作区
# schedul = BackgroundScheduler()
scheduler.init_app(app)
#schedul.add_job(func='hello', trigger='interval', seconds=60*3, id='task') # 三分钟后执行
scheduler.start()
return app
添加定时任务是有注释和add_job()两种方式,但是我发现add_job在这里并不好用。
最关键的地方就是,添加上下文信息
# 提供flask上下文对象
with scheduler.app.app_context():
result = db.session.execute(sql)