【发布时间】:2018-02-14 14:30:07
【问题描述】:
我正在使用 AppEngine 创建一个我想从程序中更新的页面。具体来说,我正在获取一些市场数据,并希望有一个显示当前价格的表格(或其他适当的东西)。让我明确一点:我是新手,我认为我的问题是我没有很好地提出这个问题来找到一个好的(最佳)答案。我什至不确定 AppEngine 一定是要走的路。我还要提醒一下,我一直在通过 Udacity 学习,所以如果代码看起来很熟悉——感谢 Steve Huffman。
我已经通过 jinja2 创建了该页面,并且我设法调整了适当的库和沙箱参数以获取市场更新。我创建了一个 html 表并传入了一个字典,其中包含交换和买卖对的值。表格创建得很好——但是当我再次渲染时,我得到的表格在页面上重复出现,而不是一张更新市场价格的表格。
这是 html/jinja2(我放弃了所有样式以使其更短):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Table template</title>
</head>
<body>
<h1>Table template</h1>
<table>
{% for exch in mkt_data %}
<tr>
<td> <div>{{exch}}</div></td>
<td> <div>{{mkt_data[exch][0]}}</div></td>
<td><div>{{mkt_data[exch][1]}}</div></td>
</tr>
{% endfor %}
</table>
</body>
</html>
代码如下:
import os
import jinja2
import webapp2
import ccxt
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir),
autoescape=True)
class Handler(webapp2.RequestHandler):
def write(self, *a, **kw):
self.response.out.write(*a, **kw)
def render_str(self, template, **params):
t = jinja_env.get_template(template)
return t.render(params)
def render(self, template, **kw):
self.write(self.render_str(template, **kw))
class MainPage(Handler):
def get(self):
self.render("table.html", mkt_data=btc)
for x in range(3):
for exch in exchanges:
orderbook=exch.fetch_order_book('BTC/USD')
bid = orderbook['bids'][0][0] if len(orderbook['bids'])>0 else None
ask = orderbook['asks'][0][0] if len(orderbook['asks'])>0 else None
btc[exch.id]=[bid,ask]
self.render("table.html", mkt_data=btc)
gdax = ccxt.gdax()
gemini = ccxt.gemini()
exchanges = [gdax, gemini]
btc = {"gemini":[0,1], "gdax":[1,2]}
for exch in exchanges:
exch.load_markets()
app = webapp2.WSGIApplication([('/', MainPage)], debug=True)
我有两个问题: 首先,为什么我让表格重复?我想我知道为什么,但我想听一个正式的理由。 其次,我应该应该做什么?我最初开始学习 javascript/node,但后来似乎很难包装所有适当的库(正在研究 browserify,但后来认为 appengine 可能更好,所以我可以更轻松地托管一些东西供其他人查看)。我尝试集成一些javascript,但这并没有让我到任何地方。现在我遇到了 Firebase,但在我去学习另一个“东西”之前,我想问问其他人是如何做到这一点的。我确定有多种方法,但我是网络编程新手;我将网页视为一种不错的 UI 和交付机制。
一些补充说明:使用 Ubuntu、virtualenv、ccxt 库(用于加密货币)。
编辑:我检查了丹的答案,因为它提供了一个解决方案。我很想知道 Firebase 是否是“一种”更正确的解决方案,而不是自动刷新。
【问题讨论】:
-
请为第二个问题创建一个单独的帖子并相应地编辑这个。
-
另外,它似乎与 google-app-engine 没有直接关系。
标签: python google-app-engine web jinja2