从预定函数

时间:2018-03-24 13:44:07

标签: python flask routing

我有一个Flask应用程序,它运行一个Web应用程序来控制警报。我使用apscheduler来触发函数triggerAlarm(),其中我希望有逻辑来实际触发它,但我也想让网页显示另一个alarm.html,无论用户是哪个网站目前在。 这个想法是通过打开另一个hmtl页面(可能是主页面,具有上下文相关的文本和布局)向用户显示警报响起!警报后页面内容也已过时。如果应显示/更新警报后信息,则客户端必须重新加载页面。 这是关键问题:在我的脑海中,有必要将每个客户端重定向到此事件的警报页面。也许有一个更好的解决方案。 (我不想使用javascript,因为除了经常使用的3种语言之外我已经使用了4种语言。)

问题是,函数本身没有“路径”,也不是应用程序的一部分(这就是我认为的情况)。此外,我不能轻易地使它成为一条路线,因为它不是由html请求激活,而是由调度程序激活。 如何触发功能并重定向到指定的页面?

*我尝试了redirect()RequestRedirect() w /和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 个答案:

答案 0 :(得分:1)

如果您已经定义了一个方法“triggerAlarm()”,并希望将其用于路线,那么请创建您的路线,如:

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

当调度程序在用户点击route / alarm-url时运行triggerAlarm(),然后将它们返回到主页时,会发生同样的事情。

需要注意的是,您可以在烧瓶路径之外,其他模块等中定义方法,然后在烧瓶路径中调用这些方法。

<强> 更新

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

class StatusDenied(Exception):
  pass

@app.errorhandler(StatusDenied)
def web_alarm(error):
  return redirect(url_for("/")) 

def triggerAlarm():
  ...
  raise StatusDenied