我正在查看 Google 提供的有关如何开始使用 Python 的示例;特别是这里发布的代码; http://code.google.com/appengine/docs/python/gettingstarted/usingdatastore.html
我想学的东西在这里:
class Guestbook(webapp.RequestHandler):
def post(self):
greeting = Greeting()
if users.get_current_user():
greeting.author = users.get_current_user()
greeting.content = self.request.get('content')
greeting.put()
self.redirect('/')
他们正在保存评论,如果用户登录,我们就会保存该用户;如果不是,它是空的,当我们将它从数据库中取出时,我们实际上在这里检查:
if greeting.author:
self.response.out.write('<b>%s</b> wrote:' % greeting.author.nickname())
else:
self.response.out.write('An anonymous person wrote:')
所以我想要的是使用 User 对象来获取信息,如下所示:
class Guestbook(webapp.RequestHandler):
def post(self):
user = users.get_current_user()
if user:
greeting = Greeting()
if users.get_current_user():
greeting.author = users.get_current_user()
greeting.content = self.request.get('content')
greeting.put()
self.redirect('/')
else:
self.redirect(users.create_login_url(self.request.uri))
所以,我想用该代码做的是将用户发送到登录网址(如果他没有登录);然后带着他发布的所有内容回来并实际发布。但发生的情况是,它甚至没有执行该操作,因为帖子中没有任何内容。
我知道我可以在会话中添加一些内容并在留言簿的获取操作中检查它,但我想检查是否有人可以提出更好的解决方案。
问题是,
self.redirect
无法“携带” POST
HTTP 请求的有效负载,因此(从 post
方法)重定向到登录 URL &c 将会出现错误(事实上,我相信登录 URL 将在完成后使用 get
继续,并且无法要求它执行 post
来代替)。
如果您不想将
POST
负载存储在某个地方(会话或其他),您可以通过将上面代码片段中的 def post
更改为 def get
,当然还有 action="post"
来使代码正常工作。在示例其他部分编写的 HTML 中,您还没有剪切到 action="get"
。还有其他较小的解决方法(您可以接受 post
来自登录用户的“正常”消息,并将其重定向到 get
,如果他们尚未登录,这可能会做一些更简单的事情),但我认为此信息足以帮助您从这里继续,对吧?