美文网首页FLASK入门
flask-apscheduler的app_context问题

flask-apscheduler的app_context问题

作者: Kant_14 | 来源:发表于2018-05-12 11:30 被阅读38次

在flask应用中处理定时任务,有不少好用的模块,其中一个是apscheduler。apscheduler虽好用,但比较容易碰到找不到上下文环境的问题。一般的例子,总是把任务函数写在app创建的同一个文件中,从而避免这个问题,但在现实中,我们一般还是希望单独放一个文件,方便管理。

如果把任务函数单独放一个文件,调用flask的current_app是无效的,一般采用的方式是,在任务函数中临时调用app创建函数,生成一个新的应用,并使用这个新应用的上下文环境。比如说:

from app import create_app

def shcduler_job1():
        app = create_app(args)
    with app.app_context:
        do the job

这是一个可行的解决方案,不过如果任务数较多,或者任务间隔比较短,就会导致app被大量创建的问题,伴随产生的是诸如文件调用次数过多、数据库session数超出等问题。那么,我们就考虑,能不能使用一个单独的app对象,作为定时任务的固定环境,避免每次都创建一个。比如说:

from app import create_app

APP = create_app(args)

def shcduler_job1():
        global APP
    with APP.app_context:
        do the job

直接这样写是有问题的,因为定时任务模块会在应用创建的时候,也就是create_app()函数中被引入,所以这样写会导致循环问题,因此,APP的初始化工作应该被滞后到执行函数的时候,于是修改代码:

from app import create_app

APP = None

def get_app():
    global APP
    APP = APP if APP is not None else create_app(args)
    
def shcduler_job1():
    get_app()
    with APP.app_context:
        do the job

这个方案虽然似乎能够运行,但终究是极为丑陋的,也因此放出来,希望有思路或者有经验的同仁多指教。

相关文章

  • flask-apscheduler的app_context问题

    在flask应用中处理定时任务,有不少好用的模块,其中一个是apscheduler。apscheduler虽好用,...

  • 有关flask-apscheduler文档

    apscheduler 官方文档flask-apscheduler 案例基于Flask-APScheduler实现...

  • Flask-APScheduler

    APScheduler是一款功能非常强大的定时任务框架。利用APScheduler框架我们可以很方便实现一个基于P...

  • Flask-APScheduler 爬坑指南

    最近使用Flask开发时遇到一个需求,需要在后台系统里进行定时任务的管理,这里选择了Flask-APSchedul...

  • Flask-APScheduler重复执行2次的解决办法

    1、背景 最近需要做拼音搜索的定时更新功能。因此考虑在拼音搜索的接口里加入定时调度功能,以定时更新拼音搜索的语料库...

  • 问题的问题

    “你别总给我说问题、问题,给我提一些建设性的建议行不?” “你咋变成了意见篓子?” 满腔热血地跑到领导面前表功,结...

  • 问题的问题

    “你别总给我说问题、问题,给我提些建设性的建议行不?” “你咋变成了意见篓子?” 满腔热血地跑到领导面前表功,结果...

  • 问题的问题

    问题家庭的问题是:家长本身用着有问题的方法教育孩子,没问题的孩子也变得有问题。 而且更严重的问题是:家长并没有意识...

  • 问题 的问题

    人大部分时间是在矛盾中挣扎着,有时候是心里想的是这样,但是不得不面对现实和道德,而选择了与内心不相符的决定...

  • 问题的问题

    现实问题,很多生活中,男人考虑问题往往没有女人周全,细致,男人只看生活的表面,然而女人,看的是生活的全面问题,就像...

网友评论

  • ee85da25b846:我也遇到了这个问题,一种方式是add_job时,把current_app当作参数传进去
    还一种想法是,明明init_app有把scheduler的app赋值为flask的app,只是不知道在job里怎么访问
    scheduler=APScheduler()
    scheduler.init_app(app)
    #此时scheduler.app就是current_app,而current_app.apscheduler就是scheduler,理论上是可以相互调用

本文标题:flask-apscheduler的app_context问题

本文链接:https://www.haomeiwen.com/subject/zdbcdftx.html