每次在 Python 中查看网页时,如何刷新来自 yahoo finance API 的数据?

How can I refresh data from yahoo finance API every time webpage is viewed in Python?

我是 运行 个人使用的网站 Bottle, a simple web server for python.

我正在使用 this API 从雅虎财经获取市场数据。

这是我的脚本(我的第一个 Python 脚本,顺便说一句)的简化版本,带有解释其工作原理的注释。我希望这是可以理解的: 编辑:不知道我是否说清楚了,但并不是所有的代码都在这里,我去掉了很多,因为在这种情况下它是无关紧要的。

from bottle import route, run, template
from yahoo_finance import Share
#Using AAPL and FB as an example..
# Gets market data
AAPL = Share('AAPL')
FB = Share('FB')
# Does a whole bunch of things with the data that eventually makes readable portfolio percentages..
# This is SUPPOSED to be a function that refreshes the data so that when called in the template it has up to date data.
# Refresh market data..
def refreshAll():
    AAPL.refresh()
    FB.refresh()
    #Basically this just has a bunch of lines that refreshes the data for every symbol
# Makes it accessible to my template..
# Variables changed to make it understandable..
my_dict = {'holdings': printTotalHoldings, 'day_change': PercentDayChange, 'total_change': PercentTotalChange, 'date': date}
# This is supposed to make the function accessible by the view. So when I call it, it refreshes the data. Doesn't seem to work though..
my_dict['refresh'] = refreshAll

# Makes the template routed to root directory.
@route('/')
def index():
    # Template file index.tpl.. **my_dict makes my variables and functions work on the view.
    return template('index', **my_dict)
# Starts the webserver on port 8080
if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    run(host='0.0.0.0', port=port, debug=True)

所以这基本上就是我的 index.py 文件的样子。

这是我在页面顶部的模板中的内容。我会认为每次查看页面都会刷新数据,对吗?

% refresh() #Refreshes market data

然后用数据调用变量我只是把这样的东西放在 HTML:

应该去的地方
<p class="day_change">Today's Change: <span id="price">{{get('day_change')}}</span></p>

一切正常,除了数据永远不会改变。为了实际刷新数据,我必须在服务器上停止并启动我的脚本。 这有意义吗?所以我的问题是,如何让我的数据刷新而不每次都停止并重新启动我的脚本?

谢谢!请让我知道是否有什么不够合理。我在这方面遇到了一些麻烦。

在 return 之前调用 index() 中的刷新代码。

如果您未处于 DEBUG 模式,则 Bottle is caching 您的渲染模板。

两件事:

  • Turn debug mode on 看看是否有帮助。 bottle.debug(True) 在 运行 服务器之前。 (编辑:我之前没有注意到您已经在使用调试模式。无论如何将此项目留在这里以供参考。)

  • 不要从模板中调用 refresh()(或任何其他状态更改或阻止函数)。这是个坏主意。正如 totowtwo 所建议的那样,您应该在调用模板之前从 index 调用它。


@route('/')
def index():
    refresh()
    return template('index', **my_dict)

  • 打印出 AAPL 等人的价值。在您调用 refresh() 之后但在您调用模板之前,确认它们正在按照您的预期进行更新。

@route('/')
def index():
    refresh()
    # print the value of AAPL here, to confirm that it's updated
    return template('index', **my_dict)

  • 无论如何,您的模板如何访问 AAPL 和 FB?它们被传递到哪里?