我有一个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("/"))
答案 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