我是谷歌应用引擎的新手,我正在尝试这个guestbook谷歌代码示例。我的问题是,当我发布帖子时它不会显示它但是当我发布第二个帖子时它会显示第一个帖子。似乎第一次需要刷新页面,看起来这段代码“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()
答案 0 :(得分:1)
我没有看到此代码有任何问题,因此我倾向于认为您的浏览器可能正在缓存主页,因此无需实际调用AppEngine网站即可显示结果。我建议通过在URL末尾添加一个参数来修改重定向,这将导致浏览器调用服务器。这是一种方法:
将import time
添加到文件顶部的导入中。
将post
Guestbook
方法的结尾更改为:
timestamp = str(time.time()).replace(".","")
self.redirect('/?cachebuster=' + timestamp)
添加到URL的GET查询参数值将确保您的浏览器向服务器发出新的实际请求。
编辑: 傻我。我认为您所看到的是最终一致性的影响。简而言之:Google的高复制数据存储区将您的应用程序数据存储在多个数据中心中,但您必须采取特殊措施来保证在执行查询时强烈一致结果;否则,为您的查询提供服务的数据中心可能尚未收到包含新数据的更新。
AppEngine Developer Docs中记录的内容非常详细:https://developers.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency