【问题标题】:Realtime(ish) updates on Web Page using AppEngine使用 AppEngine 对网页进行实时(ish)更新
【发布时间】: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


【解决方案1】:

重复表是您的MainPage.get() 内多次调用self.render() 的结果 - 包括上述和for 循环内的重复调用。

for 循环构建模板值之后(在MainPage.get() 末尾)更新您的代码以进行单个此类调用

【讨论】:

  • 谢谢@dan。因此,render 不会进行完整的重新绘制。那么我将如何提供值的更新?
  • 只需提供更新的值以在下一次请求时填充模板。最终使您的页面自动刷新(在客户端 - 浏览器会自动发出后续请求)
  • 初始请求的响应发送后无法修改响应——请求上下文丢失
  • 再次感谢,丹。我实现了自动刷新并且它起作用了。但是,从长远来看,这不是一个“正确”的解决方案。有关于 Firebase 或其他方面的反馈吗?
  • 我还没有使用 Firebase。也许制作一个更智能的页面,在客户端使用 JS 在后台发出 AJAX 请求并使用接收到的数据更新页面元素?这样你就不需要重新加载整个页面了。
猜你喜欢
  • 1970-01-01
  • 2011-10-14
  • 2011-07-15
  • 2013-05-03
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2016-07-26
相关资源
最近更新 更多