我正在使用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但是它似乎很难包装所有适当的库(正在研究浏览器,但后来认为appengine可能更好,所以我可以更轻松地托管其他人看到的东西)。我尝试整合一些javascript,但这并没有让我任何地方。现在我已经遇到了Firebase,但在我开始学习另一个&#34;之前&#34;我想问其他人怎么做。我确定有多种方式,但我是网络编程的新手;我将网页视为一个不错的用户界面&amp;交付机制。
一些补充说明:使用Ubuntu,virtualenv,ccxt库(用于加密货币)。
编辑:我检查了Dan的答案,因为它提供了一个解决方案。我很想知道Firebase是否是&#34; a&#34;更正确的解决方案,而不是自动刷新。答案 0 :(得分:2)
重复的表格是您self.render()
内多个MainPage.get()
次调用的结果 - 上面和for
循环中的重复调用。
在for
循环构建模板值后(MainPage.get()
结束时)更新代码以进行单个此类调用