Python AppEngine; 获取用户信息和发布参数?

2 投票
1 回答
2190 浏览
提问于 2025-04-15 11:56

我在查看谷歌提供的关于如何开始使用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))

我希望用这段代码来做的是,如果用户没有登录,就把他引导到登录页面;然后再让他回来,带着他之前填写的内容进行发布。但是现在的问题是,因为在提交的内容中什么都没有,所以根本没有达到这个操作。我知道我可以在会话中放一些东西,然后在留言簿的获取操作中检查它,但我想看看有没有人能想出更好的解决方案!

谢谢

1 个回答

3

问题是,self.redirect 不能“带着”一个 POST 请求的内容,所以从 post 方法进行重定向到登录网址时会出现问题(实际上,我认为登录网址会在完成后使用 get 方法继续,而没有办法让它使用 post 方法)。

如果你不想把那个 POST 请求的内容存放在某个地方(比如会话或其他方式),你可以通过把你上面代码中的 def post 改成 def get 来让代码正常工作,当然,HTML中其他部分的 action="post" 也要改成 action="get"。还有其他一些小的变通方法(比如你可以接受登录用户的 post 请求,然后把他们重定向到一个 get 方法,这个方法可以做一些更简单的事情,如果他们还没有登录的话),但我觉得这些信息已经足够帮助你继续了,对吧?

撰写回答