Javascript 如何使用GAE仅刷新部分页面

Javascript 如何使用GAE仅刷新部分页面,javascript,python,google-app-engine,web,Javascript,Python,Google App Engine,Web,我搜索过这个概念,但并不真正理解它到底是如何工作的。我的后端使用webapp2和GAE,我想刷新从数据库中提取的页面 页面上还有其他内容,我只需要专门刷新表内容。我目前正在使用 <meta http-equiv="refresh" content="10"> 每10秒刷新一次整个页面,但我需要只刷新部分页面的内容。对任何JS或JQuery添加的解释都会很好 我真的不明白的是,我必须在后端更改什么才能允许这种刷新。一个简单的HTML占位符: <div id="tab

我搜索过这个概念,但并不真正理解它到底是如何工作的。我的后端使用webapp2和GAE,我想刷新从数据库中提取的页面

页面上还有其他内容,我只需要专门刷新表内容。我目前正在使用

    <meta http-equiv="refresh" content="10">

每10秒刷新一次整个页面,但我需要只刷新部分页面的内容。对任何JS或JQuery添加的解释都会很好


我真的不明白的是,我必须在后端更改什么才能允许这种刷新。

一个简单的HTML占位符:

<div id="tablehere"></div>
JS制作并显示一个新表(这里有一百万个备选方案,我不是JS专家,这只是一种方法):

在所有需要的导入之后,在
表格.py
中:

class Tablerow(ndb.Model):
    col1: ndb.StringProperty()
    col2: ndb.StringProperty()

class Tablehandler(webapp2.RequestHandler):
    def get(self):
        data = [tr.to_dict() for tr in Tablerow.query().iter()]
        response.write(json.dumps(data))

app = webapp2.WSGIApplication([('/thetable', Tablehandler)])

呸——非常骨瘦如柴,但我还是花了很长时间才写出来。但正如您所看到的,应用程序引擎部分实际上是微不足道的——它是HTML、Javascript和Jquery端,迄今为止花费了大部分精力!)

GAE端所需要的只是一个URL处理程序,该URL只提供相关数据的JSON。在JS脚本上,它是一个ajax调用,在JQuery中是最简单的。要获得更复杂的轮询,而不是定期轮询,您可以使用Channel,,一个持久连接,它允许服务器在检测到更改时启动发送,这样JS就不必轮询了——这很酷。但是,我想,最好从简单开始。太好了!这种解释是有道理的。我会努力的,然后再打给你。感谢您提供有关该频道的链接。看起来真的很酷。离开频道面向未来我已经画了一个骨架(但仍然很长,几乎只在html/js/jquery方面——GAE部分真的很琐碎!)。因此,正如您所看到的,“我必须在后端更改以允许这种刷新”(没有通道,仅通过轮询)是“本质上没有任何意义”:-)谢谢!轮询速度极快(.2秒或仅输入0)有问题吗?我需要它快速更新和应用程序将只用于一个小时的时间。我可以把频道解决方案看作是未来的事情,但这是我想要的一个快速解决方案。@tabchas,您轮询的频率越高,您在服务器和用户浏览器上的负载就越大。只有实验才能告诉你有多少负载太多,这当然取决于有多少浏览器同时连接到你的GAE应用程序。另一个问题:我想为用户打开此网页提供一种方法,每当他们在该网页上时,它都会更新他们在该网页上的服务器。它应该只在用户实际查看网页时才起作用(不处于非活动状态,如从切换选项卡)。我已经实现的一种方法是不断ping服务器,告诉它我还活着。在这种情况下,通道API会有用吗?@tabchas,在如何确定用户是否正在查看时,我完全没有深度——我不是满栈的人,我是87%的后端。我建议在这个完全不同的问题上发布一个单独的问题!)通道API仅在从服务器到浏览器之间工作。要从浏览器向服务器发送消息,您将使用普通的GET、POST等。您只能通过通道向用户发送消息,而不能进行备份-毕竟,用于发送消息备份的工具已经存在(即GET、POST)。
maketable = function(data) {
  var tabdiv = document.getElementById("tablehere");
  var tabhead = '<table><thead><tr><th>Col1</th><th>Col2</th></tr></thead><tbody>';
  for(var i=0,len=data.length; i<len; i++) {
    tabhead += '<tr><td>' + data[i].col1 + '</td><td>' + data[i].col2 + '</td></tr>';
  }
  tabhead += '</tbody></table>';
  tabdiv.innerHTML = tabhead ;
}
url: /thetable
script: thetable.app
class Tablerow(ndb.Model):
    col1: ndb.StringProperty()
    col2: ndb.StringProperty()

class Tablehandler(webapp2.RequestHandler):
    def get(self):
        data = [tr.to_dict() for tr in Tablerow.query().iter()]
        response.write(json.dumps(data))

app = webapp2.WSGIApplication([('/thetable', Tablehandler)])