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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask和peewee FlaskDB()“连接已经打开”与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.朋友:

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时我还是有点新手。

谢谢!

答案

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

但我基本上设置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

以上是关于Flask和peewee FlaskDB()“连接已经打开”与APScheduler的主要内容,如果未能解决你的问题,请参考以下文章

Flask + Peewee:在哪里创建表格?

Peewee ORM中如何选择和限制related_name连接?

flask-classy 和 peewee,元类冲突错误

Flask peewee AttributeError:“ModelSelect”对象没有属性“_meta”

如何更改 Flask-peewee 中的 UserDoesNotExist SELECT 行为 - python & mysql

如何将 Flask SQLAlchemy amp;Peewee 的查询结果转换成 json