我查看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))
所以,我想用该代码做的是将用户发送到登录URL(如果他没有登录);然后用他在帖子中发布的任何东西回来并实际发布它。但是发生的事情是,它甚至没有达到那个动作因为这篇文章中没有任何内容。 我知道我可以在会话中加入一些东西并在留言簿的get动作中检查它,但我想检查是否有人能想出更好的解决方案!
由于
答案 0 :(得分:3)
问题是,self.redirect
无法“携带”POST
HTTP请求的有效负载,因此(从post
方法)重定向到login-url&amp; c会出现行为异常(实际上我相信登录网址会在完成后继续使用get
继续,并且无法让它改为post
。
如果您不希望将POST
有效负载存放在某个地方(会话或其他地方),则可以通过将上面的代码段中的def post
更改为def get
来使代码生效当然,在示例的其他部分中写入的HTML中的action="post"
,您还没有剪切到action="get"
。还有其他一些小的解决方法(您可以接受post
来自登录用户的“正常”消息,并将它们重定向到get
,如果他们还没有登录,可能会做更简单的事情,但是我认为这些信息足以帮助您从这里继续,对吗?