所以我正在使用Google App Engine构建一个小型wiki,如果您输入/newpage
之类的网址,如果它已经存在,它会将您重定向到它,否则会将您重定向到{{1您可以在其中编辑(或在这种情况下,添加)页面的内容。编辑后,它会将您重定向到页面本身,即/edit/newpage/
。
以下是代码:
包含条目的表格:
/newpage
应用处理程序:
class Entries(db.Model):
title = db.TextProperty(required = True)
content = db.TextProperty(required = True)
created = db.DateTimeProperty(auto_now_add = True)
处理程序功能:
app = webapp2.WSGIApplication([('/', MainPage),
('/signup', SignUp),
('/welcome', Welcome),
('/login', Login),
('/logout', Logout),
('/([a-zA-Z0-9_]+)', WikiEntry),
('/edit/([a-zA-Z0-9_]+)', EditWikiEntry)
], debug = True)
class WikiEntry(webapp2.RequestHandler):
def get(self, wiki_entry):
1 entry = Entries.all().filter('title =', wiki_entry).get()
2 # entry = db.GqlQuery("select * from Entries where title = 'hello'")
3 # logging.error(entry.title)
4 logging.error(entry)
5 if entry:
6 logging.error("inside if")
7 self.response.write(render_str('entrypage.html', entry=entry))
8 else:
9 logging.error("inside else")
10 self.redirect('/edit/' + wiki_entry)
class EditWikiEntry(webapp2.RequestHandler):
1 def get(self, wiki_entry):
2 self.response.write(render_str('edit.html', wiki_entry = wiki_entry))
3 def post(self, wiki_entry):
4 content = self.request.get('textarea')
5 if content:
6 e = Entries(title = wiki_entry, content = content)
7 e.put()
8 self.redirect('/' + wiki_entry)
是textarea
页面上textarea的名称。
这是edit
:
entrypage.html
问题就在这里:我输入了<html>
<head>
<title>{{ entry.title }}</title>
</head>
<body>
{{ entry.content }}
</body>
</html>
,因为它不存在,它将我重定向到/hello
页面。我输入内容edit
,点击保存,但它再次将我重定向到<h1> Hello World </h1>
页面(textarea为空白)。我进入管理页面并确认确实有一个标题和内容的对象,因为我保存了。
我尝试调试,发现edit
第1行的查询功能不起作用。当我在第4行打印WikiEntry
时,它是entry
。当我在None
的第2行中手动将字符串hello
放入查询时,我确实从第4行获取了一个对象,并将其重定向到WikiEntry
,但没有任何内容它。当我尝试在控制台上打印标题时,如第3行所示,它抛出entrypage.html
:
AttributeError
如果对象没有AttributeError: 'GqlQuery' object has no attribute 'title'
属性,那么它是如何首先打印对象的?
title
我真的很困惑,不知道如何解决这个问题。
答案 0 :(得分:1)
您正在执行查询以检索WikiPage,有时(由于最终的一致性)查询将找不到刚刚创建的页面。
您需要花一些时间阅读最终一致性,在使用数据存储时理解这一点非常重要。
我建议你考虑使用wiki页面名称作为Entries实体的键,然后通过Key而不是查询来获取。这将保证您始终能够检索刚刚创建的条目。