配置我的Python Flask应用程序每隔30秒调用一次函数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (340)

我有一个烧瓶应用程序,它返回一个JSON响应。但是,我希望它每隔30秒调用一次该函数,而无需单击浏览器上的刷新按钮。这就是我做的

使用apscheduler

。这段代码在application.py中

from apscheduler.schedulers.background import BachgroundScheduler

def create_app(config_filname):  
    con = redis.StrictRedis(host= "localhost", port=6379, charset ="utf-8", decode_responses=True, db=0)
    application = Flask(__name__)
    CORS(application)
    sched = BackgroundScheduler()

    @application.route('/users')
    @cross_origin()
    @sched.scheduled_job('interval', seconds = 20)
    def get_users():
        //Some code...
        return jsonify(users)
    sched.start()
    return application

然后在我的wsgi.py中

from application import create_app
application = create_app('application.cfg')

with application.app_context():
    if __name__ == "__main__":   
    application.run()

当我运行这个appliaction时,我得到了json输出,但是在它抛出20秒后它不会刷新

RuntimeError:在应用程序上下文之外工作。这通常意味着您尝试使用以某种方式与当前应用程序对象进行交互所需的功能。要解决此问题,请使用app.app_context()设置应用程序上下文。有关更多信息,请参阅文档。

我究竟做错了什么?我很感激任何建议。

提问于
用户回答回答于

我没有使用应用程序调度来执行此操作,但以下是我过去的工作方式:通过set_interval()和JavaScript在前端进行自动更新....

然后,您必须向烧瓶功能发出AJAX GET请求:http//flask.pocoo.org/docs/1.0/patterns/jquery/

因此,基本上在一个set_interval()函数中,30000毫秒(30秒)会对烧瓶函数的名称发出Ajax GET请求。不使用返回渲染模板,而是使用return jsonify(后跟要返回的数据并放入HTML - 列表或变量等)。

同样在你的定时设置间隔函数....使用JQuery(或JavaScript,但JQuery将是一行)通过jsonified并返回到的变量重新加载所有所需的HTML元素(如单个表和/或列表)前端。

然后使用特定元素的ID加载带有JQuery的元素....这就像渲染页面一样,而是你真的只使用JavaScript每30秒调用一次烧瓶函数并获得一个JSON响应(而不是渲染一个页)。然后,通过该响应,您可以重新填充需要更新的HTML。

用户回答回答于

如果这样做会以某种方式颠覆问题,但如果您希望每30秒发送一次用户,则不应该在后端进行此操作。后端应该只在发出请求时发送数据。为了定期发送数据,需要将前端配置为定期发出请求

就个人而言,我建议使用i-frames和javascript的组合,如此堆栈溢出问题中所述: 自动刷新IFrame HTML

最后,当涉及到您的实际代码时,似乎这里有一个错误:

if __name__ == "__main__":   
application.run()

“application.run()”行应该缩进,因为它在if语句中

扫码关注云+社区

领取腾讯云代金券