代码之家  ›  专栏  ›  技术社区  ›  mike

从预定功能路由烧瓶

  •  0
  • mike  · 技术社区  · 6 年前

    我有一个烧瓶应用程序,它运行一个web应用程序来控制警报。我使用apscheduler触发函数 triggerAlarm() 在这里面,我想有逻辑来实际触发它,但我也想有网页来显示另一个警报。html,无论用户当前在哪个站点上。 这样做的目的是向用户显示,通过打开另一个hmtl页面(可能是主页,其中包含与上下文相关的文本和布局),警报就发出了!此外,页面内容在报警后过期。如果应显示/更新报警后信息,客户端必须重新加载页面。 这是关键问题:在我看来,有必要在这个事件中将每个客户端重定向到报警页面。也许一直都有更好的解决方案。(我不想使用javascript,因为除了我经常使用的3种语言外,我已经使用了4种语言。)

    问题是,函数本身没有“路由”,并且不是应用程序的一部分(我认为这就是发生的情况)。此外,我无法轻松地将其设置为路由,因为它不是由html请求激活的,而是由调度程序激活的。 如何触发函数并重定向到指定页面?

    *我试过了 redirect() RequestRedirect() 有/无 url_for() return render_template('index.html', **templateData) 。。。但我无法加载所需的页面。

    代码如下所示:

    from apscheduler.schedulers.background import BackgroundScheduler
    # Web Server Gateway WSGI
    from flask import Flask, render_template, request, url_for
    
    scheduler = BackgroundScheduler()
    scheduler.start()
    scheduler.add_job(triggerAlarm,'date',run_date=somedate)
    
    @app.route("/")
    def index():
        # prepare templateData
        return render_template('index.html', **templateData)
    
    def triggerAlarm():
        # this doesn't work, since it is called by the scheduler and has no route!
        return redirect(url_for("/")) 
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Logan Bertram    6 年前

    如果您定义了一个方法“triggerAlarm()”,并希望使其可用于路由,则创建如下路由:

    @app.route("/alarm-url")
    def web_alarm():
        triggerAlarm()
        return redirect(url_for("/")) 
    

    这将导致与调度程序运行triggerAlarm()时发生的情况相同的情况,即用户点击路由/报警url,然后将其返回主页。

    可以在flask路由之外、其他模块中等定义方法,然后在flask路由中调用这些方法。

    使现代化

    如果必须将triggerAlarm()与任何路由分开,可以执行以下操作:

    class StatusDenied(Exception):
      pass
    
    @app.errorhandler(StatusDenied)
    def web_alarm(error):
      return redirect(url_for("/")) 
    
    def triggerAlarm():
      ...
      raise StatusDenied