【问题标题】:Add a cron job using apscheduler in Flask (flask factory)在 Flask (flask factory) 中使用 apscheduler 添加一个 cron 作业
【发布时间】:2020-06-03 11:32:08
【问题描述】:

朋友们。我正在尝试添加一个 cron 作业来定期调用我的 cron_job_notes_recall 函数,但 Flask 给出了一个错误:

No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.

好的,我遵循 Flask Factory 方法,并且所有内容都在 init.py 中初始化,因此我决定从这里开始我的工作。我很确定该函数可以正常工作,因为我将它作为路由放入函数并调用它。我想问题可能是由我的数据库(?)引起的。该函数只是对上面初始化的 DB 进行查询,然后如果查询返回某些内容,则发送电子邮件。您知道我的 cron 作业应该在哪里初始化吗?

初始化.py

# Globally accessible libraries
db = SQLAlchemy()
login_manager = LoginManager()

sched = BlockingScheduler()


def create_app(test_config=False):
    """Initialize the core application."""
    logging.basicConfig(format='%(asctime)s - %(message)s', level=logging.INFO)

    app = Flask(__name__, instance_relative_config=False)
    if not test_config:
        app.config.from_object('config.Config')
        pprint(app.__dict__)
    else:
        app.config.from_object('config.TestConfig')
        app.config.update(
            BCRYPT_LOG_ROUNDS=4,
            HASH_ROUNDS=1,
            LOGIN_DISABLED=True,
            WTF_CSRF_ENABLED=False,
            SECRET_KEY=os.urandom(25),
            TESTING=True
        )

    db.init_app(app)
    login_manager.init_app(app)

    with app.app_context():

        # Include our Routes
        from flask_bootstrap import Bootstrap
        from . import routes
        from . import auth

        # Register Blueprints
        app.register_blueprint(auth.auth_bp)
        Bootstrap(app)
        db.create_all()


        # HERE IS MY CRON JOB
        sched.add_job(cron_job_notes_recall, 'interval', seconds=1)
        sched.start()

        try:
            return app, logging
        except:

【问题讨论】:

  • 但是cron_job_notes_recall函数定义在哪里?
  • 在前面几行导入的模块 routes.py 中-“from .import routes”

标签: python-3.x flask cron flask-sqlalchemy apscheduler


【解决方案1】:

我也在谷歌搜索问题的答案。还没有解决方案,只有一些想法:问题根源是'This happens because the data are lost when the context (with app.app_context()) ends' 使用 Redis 作为外部上下文的一种可能解决方案storage

【讨论】:

  • 我通过创建一个负责处理我的 cron 作业的新服务解决了这个问题。我认为这是最简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 2018-03-09
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
相关资源
最近更新 更多