filter()和get()没有给出正确的GQLQuery结果

时间:2016-08-03 05:48:23

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

所以我正在使用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

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

1 个答案:

答案 0 :(得分:1)

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

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

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