我是Flask的新手。如何通过不断变化的数据为给定页面每分钟调用一次render_template('prices.html',stock_price)?
我试过了:
throttle.Throttle(period=60) # 60 second throttle
while True:
stock_price = get_stock_price()
render_template('prices.html', stock_price=stock_price)
throttle.check() # Check if 60 seconds have passed otherwise sleep
唯一可行的是return render_template(...)
。显然,render_template()必须是return语句的一部分。不幸的是,一旦回归被称为游戏结束。
我如何做到这一点?我认为这只是我的无知。
答案 0 :(得分:3)
渲染模板时,运行Flask进程并在呈现模板文件后返回HTML,如您所说,使用return并且游戏结束。
即使你会发现一种真正的硬编码方式,它也不是一个好方法。您将浪费太多服务器呼叫和用户等待时间。
编写一个非常简单的Python函数,只返回股票编号(我猜你已经有一个 - get_stock_price()
)
但我会用路线装饰它(让我们说“ / getprice ”)。每个到达此页面的人都将获得一个黑色页面,但是股票价格文本。
现在真正的魔术 - 在HTML页面上使用JQuery-AJAX来调用这个函数:
$.ajax({
type: "POST",
url: "/getprice",
})
.done(function( price ) {
$("#price-box").val(price)
});
嘿,等等,我的“每分钟一次”怎么办?
诅咒我们可以将这个ajax调用插入到setInerval()
函数中,如下所示:
setInterval(function() {
$.ajax({
type: "POST",
url: "/getprice",
})
.done(function( price ) {
$("#price-box").val(price)
});
}, 1000 * 60);
告诉我你是否需要任何帮助。
好的,所以你设法每分钟发送一次get_stock_price()
功能请求。
大。
但是性能呢?
我猜你的get_stock_price()
正在做一些其他的请求,甚至还有一些网络抓取,这对服务器来说真的很难(想想当10,000名用户使用这个页面时会发生什么)。
我要做的是:
每分钟将数据从get_stock_price()
存储到您的数据库中(Cron Job将完成工作),然后当用户询问(AJAX请求)此数据时,将其从数据库中取出。< / p>
这样服务器将在后台运行,用户不会看到他的数据加载速度有任何不同。