因此,我正在使用googleappengine构建一个小wiki,如果您键入一个类似/newpage
的URL,它会将您重定向到它(如果它已经存在),否则它会将您重定向到/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
是edit
页上文本区域的名称
这里是entrypage.html
:
<html>
<head>
<title>{{ entry.title }}</title>
</head>
<body>
{{ entry.content }}
</body>
</html>
所以问题是:我输入了/hello
,由于它不存在,它将我重定向到edit
页面。我输入内容<h1> Hello World </h1>
,点击Save,但它再次将我重定向到edit
页面(文本区域为空)。我去了管理页面,并确认确实有一个标题和内容的对象,我已经保存
我试着调试,发现WikiEntry
的第1行中的查询函数不起作用。当我在第4行打印出entry
时,它是None
。当我手动将字符串hello
放入查询中时,就像WikiEntry
的第2行一样,我确实从第4行得到了一个对象,它将我重定向到entrypage.html
,但没有任何内容。当我在控制台上打印标题时,如第3行所示,它抛出了一个AttributeError
:
AttributeError: 'GqlQuery' object has no attribute 'title'
如果对象没有title
属性,那么它首先是如何打印对象的
<google.appengine.ext.db.GqlQuery object at 0x04766270>
我真的很困惑,不知道怎么解决这个问题
您正在执行一个查询来检索WikiPage,有时(由于最终的一致性),查询将找不到刚刚创建的页面
您需要花一些时间阅读最终的一致性,在使用数据存储时理解这一概念非常重要
我建议您考虑使用wiki页面名称作为Entries实体的键,然后通过键而不是通过查询获取。这将保证您始终能够检索刚刚创建的条目
相关问题 更多 >
编程相关推荐