filter() 和 get() 不提供正确的 GQLQuery 结果
filter() and get() don't give correct GQLQuery results
所以我正在使用 Google App Engine 构建一个小型 wiki,如果您输入 URL,例如 /newpage
,如果它已经存在,它会将您重定向到它,否则它会将您重定向到 /edit/newpage/
,您可以在其中编辑(或在本例中为添加)页面内容。编辑后,它会将您重定向到页面本身,即 /newpage
.
代码如下:
保存条目的table:
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>
,点击保存,但它再次将我重定向到 edit
页面(文本区域为空白)。我转到管理页面并确认确实有一个 object 标题和内容与我保存的一样。
我试过调试,发现WikiEntry
第1行的查询功能不起作用。当我在第 4 行打印出 entry
时,它是 None
。当我手动将字符串 hello
放入查询中时,如 WikiEntry
的第 2 行,我确实从第 4 行得到一个 object 并将我重定向到 entrypage.html
,但里面什么也没有。当我尝试像第 3 行那样在控制台本身上打印标题时,它抛出了一个 AttributeError
:
AttributeError: 'GqlQuery' object has no attribute 'title'
如果 object 没有 title
属性,那么它首先是如何打印 object 的?
<google.appengine.ext.db.GqlQuery object at 0x04766270>
我真的很困惑,不知道如何解决这个问题。
您正在执行检索 WikiPage 的查询,但有时(由于最终一致性)查询找不到刚刚创建的页面。
您需要花一些时间阅读最终一致性,在使用数据存储时理解这个概念很重要。
我建议您考虑使用 wiki 页面名称作为 Entries 实体的键,然后通过键而不是通过查询来获取。这将保证您始终能够检索刚刚创建的条目。
所以我正在使用 Google App Engine 构建一个小型 wiki,如果您输入 URL,例如 /newpage
,如果它已经存在,它会将您重定向到它,否则它会将您重定向到 /edit/newpage/
,您可以在其中编辑(或在本例中为添加)页面内容。编辑后,它会将您重定向到页面本身,即 /newpage
.
代码如下:
保存条目的table:
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>
,点击保存,但它再次将我重定向到 edit
页面(文本区域为空白)。我转到管理页面并确认确实有一个 object 标题和内容与我保存的一样。
我试过调试,发现WikiEntry
第1行的查询功能不起作用。当我在第 4 行打印出 entry
时,它是 None
。当我手动将字符串 hello
放入查询中时,如 WikiEntry
的第 2 行,我确实从第 4 行得到一个 object 并将我重定向到 entrypage.html
,但里面什么也没有。当我尝试像第 3 行那样在控制台本身上打印标题时,它抛出了一个 AttributeError
:
AttributeError: 'GqlQuery' object has no attribute 'title'
如果 object 没有 title
属性,那么它首先是如何打印 object 的?
<google.appengine.ext.db.GqlQuery object at 0x04766270>
我真的很困惑,不知道如何解决这个问题。
您正在执行检索 WikiPage 的查询,但有时(由于最终一致性)查询找不到刚刚创建的页面。
您需要花一些时间阅读最终一致性,在使用数据存储时理解这个概念很重要。
我建议您考虑使用 wiki 页面名称作为 Entries 实体的键,然后通过键而不是通过查询来获取。这将保证您始终能够检索刚刚创建的条目。