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)

textareaedit 页面上文本区域的名称。

这里是 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 实体的键,然后通过键而不是通过查询来获取。这将保证您始终能够检索刚刚创建的条目。