Flask和peewee FlaskDB()“连接已经打开”与APScheduler

时间:2018-05-16 18:13:15

标签: python python-3.x flask peewee apscheduler

我有一个带有peewee和一个合并的postgresql数据库的烧瓶应用程序。

在添加APScheduler作业之前,所有内容都适用于应用设置。我希望在应用程序启动时以及每8小时后运行该作业。

为flask-apscheduler和peewee配置位:

class Config(object):
    JOBS =  [
        {
            'id': 'myjob',
            'func': 'app.jobs:do_something_job',
            'trigger': 'interval',
            'hours': 8
        }
        ]
    SCHEDULER_API_ENABLED = True
    DATABASE = 'postgresext+pool://user:password@localhost:5432/dev?max_connections=32&stale_timeout=300'

app.py:

scheduler = APScheduler()
db = FlaskDB()

def create_app(config_object=Config):
    """Application Factory Pattern"""
    app = Flask(__name__.split('.')[0])
    app.config.from_object(config_object)
    db.init_app(app)
    scheduler.init_app(app)
    scheduler.start()
    # RUN the job on application creation:
    scheduler.run_job('myjob') # <--- exception thrown here
    return app

app = create_app(Config)

线scheduler.run_job('myjob')会在应用启动后立即生成peewee.OperationalError: Connection already opened.(如果我在启动应用后不久访问该页面)

虽然看起来初始作业运行仍然正常

do_something_job看起来像:

def do_something_job():
    new = NewModel(seed=new_seed())
    new.save()
    old_list = NewModel.select()
    for old in old_list:
        if old.id != new.id:
            expired = OldModel(seed=old.seed,
                       created_at=old.created_at,
                       expired_at=datetime.datetime.utcnow())
            expired.save()
            old.delete_instance()

我只是不确定我到底错过了什么,当谈到peewee / flask时我还是有点新手。

谢谢!

1 个答案:

答案 0 :(得分:0)

在接受我自己的答案之前,我会等待一段时间,因为我确信有一个可能更好/更合适的解决方案。

但我基本上将Flask-APScheduler设置为在未来30秒内运行初始作业并从我的create_app()中删除它。

我不确定是不是因为数据库在代码运行时尚未初始化或者究竟是什么,我确定这是hackish但它确实清除了异常

基本上添加了第二个作业来配置(和显式时区)

class Config(object):
    SCHEDULER_TIMEZONE = 'UTC'
    JOBS =  [
        {
            'id': 'myinitialjob',
            'func': 'app.jobs:do_something_job',
            'trigger': 'date',
            'run_date': datetime.datetime.utcnow() + datetime.timedelta(seconds=30)
        },
        {
            'id': 'myjob',
            'func': 'app.jobs:do_something_job',
            'trigger': 'interval',
            'hours': 8
        }
        ]
    SCHEDULER_API_ENABLED = True

从create_app func

中删除了初始运行
def create_app(config_object=Config):
    """Application Factory Pattern"""
    app = Flask(__name__.split('.')[0])
    app.config.from_object(config_object)
    db.init_app(app)
    scheduler.init_app(app)
    scheduler.start()
    # scheduler.run_job('myjob') # <--- removed this
    return app