使用AppEngine在Web页面上实时(ish)更新

时间:2018-02-14 14:30:08

标签: python google-app-engine web jinja2

我正在使用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;更正确的解决方案,而不是自动刷新。

1 个答案:

答案 0 :(得分:2)

重复的表格是您self.render()内多个MainPage.get()次调用的结果 - 上面和for循环中的重复调用。

for循环构建模板值后(MainPage.get()结束时)更新代码以进行单个此类调用