【问题标题】:filter() and get() don't give correct GQLQuery resultsfilter() 和 get() 没有给出正确的 GQLQuery 结果
【发布时间】:2016-08-03 05:48:23
【问题描述】:

所以我正在使用 Google App Engine 构建一个小型 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)

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

这里是entrypage.html:

<html>
<head>
    <title>{{ entry.title }}</title>
</head>
<body>
    {{ entry.content }}
</body>
</html>

所以问题来了:我输入了/hello,但由于它不存在,它把我重定向到edit 页面。我输入内容&lt;h1&gt; Hello World &lt;/h1&gt;,点击保存,但它再次将我重定向到edit 页面(文本区域为空白)。我去了管理页面并确认确实存在一个具有我保存的标题和内容的对象。

我尝试调试,发现WikiEntry第1行的查询功能不起作用。当我在第 4 行打印出entry 时,它是None。当我像WikiEntry 的第 2 行那样手动将字符串 hello 放入查询时,我确实从第 4 行得到了一个对象,它将我重定向到 entrypage.html,但其中没有任何内容。当我尝试在第 3 行中打印控制台本身的标题时,它抛出了一个 AttributeError:

AttributeError: 'GqlQuery' object has no attribute 'title'

如果对象没有title 属性,那么它最初是如何打印对象的?

<google.appengine.ext.db.GqlQuery object at 0x04766270>

我真的很困惑,不知道如何解决这个问题。

【问题讨论】:

    标签: python google-app-engine redirect google-cloud-datastore gql


    【解决方案1】:

    您正在执行查询以检索 WikiPage,有时(由于最终一致性)查询不会找到刚刚创建的页面。

    您需要花一些时间阅读最终一致性,在使用数据存储时理解这一概念很重要。

    我建议您考虑使用 wiki 页面名称作为 Entries 实体的键,然后通过键而不是查询来获取。这将保证您始终能够检索刚刚创建的条目。

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      • 2015-11-12
      • 2012-08-30
      相关资源
      最近更新 更多