0

我对谷歌应用引擎很陌生,我正在尝试这个留言簿谷歌代码示例。我的问题是当我发布一个帖子时它不会显示它但是当我发布第二个帖子时它会显示第一个帖子。似乎第一次需要刷新页面,并且该代码“self.redirect('/')”似乎比程序提前了一步。或者有不同的问题请帮助我。我不知道这是否与我的电脑有关,但如果您能帮助我,我将不胜感激。

这是原始代码:

import cgi
import os

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
from google.appengine.ext.webapp import template

class Greeting(db.Model):
  author = db.UserProperty()
  content = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)

class MainPage(webapp.RequestHandler):
  def get(self):
    greetings_query = Greeting.all().order('-date')
    greetings = greetings_query.fetch(10)

    if users.get_current_user():
      url = users.create_logout_url(self.request.uri)
      url_linktext = 'Logout'
    else:
      url = users.create_login_url(self.request.uri)
      url_linktext = 'Login'

    template_values = {
      'greetings': greetings,
      'url': url,
      'url_linktext': url_linktext,
      }

    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, template_values))


class Guestbook(webapp.RequestHandler):
  def post(self):
    greeting = Greeting()

    if users.get_current_user():
      greeting.author = users.get_current_user()

    greeting.content = self.request.get('content')
    greeting.put()
    self.redirect('/')

application = webapp.WSGIApplication(
                                     [('/', MainPage),
                                      ('/sign', Guestbook)],
                                     debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()
4

1 回答 1

1

我看不出这段代码有什么问题,所以我倾向于认为您的浏览器可能正在缓存主页并因此在没有实际调用您的 AppEngine 站点的情况下显示结果。我建议通过在 URL 末尾添加一个参数来修改重定向,这将导致您的浏览器调用服务器。这是一种方法:

添加import time到文件顶部的导入。

post将方法的结尾Guestbook改为:

timestamp = str(time.time()).replace(".","")
self.redirect('/?cachebuster=' + timestamp)

添加到 URL 的 GET 查询参数值将确保您的浏览器向服务器发出新的实际请求。

编辑:愚蠢的我。我认为您所看到的是最终一致性的效果。简而言之:Google 的 High-replication Datastore 将您应用的数据存储在多个数据中心,但您必须采取特殊措施来保证在进行查询时获得高度一致的结果;否则,为您的查询提供服务的数据中心可能尚未收到包含新数据的更新。

这在 AppEngine 开发人员文档中有很好的记录:https ://developers.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency

于 2013-07-29T16:35:18.193 回答