【发布时间】: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)
textarea 是edit 页面上文本区域的名称。
这里是entrypage.html:
<html>
<head>
<title>{{ entry.title }}</title>
</head>
<body>
{{ entry.content }}
</body>
</html>
所以问题来了:我输入了/hello,但由于它不存在,它把我重定向到edit 页面。我输入内容<h1> Hello World </h1>,点击保存,但它再次将我重定向到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