flask开发定时任务--操作数据库

背景:需要定时对图片进行目标检测,图片存储在数据库中

其实一开始,这个定时任务已经写好了,但是当时没有这些图片,就拿本地的一些图片去模拟。

当我想当然去操作数据库获取最新图片路径出现了如下问题

执行时报错: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)

你可能感兴趣的:(flask,数据库,python)