联合登录的新用户无法识别

时间:2012-10-17 18:47:50

标签: python google-app-engine openid federated-identity

我正在使用Google App Engine Python联合登录,它使用OpenID让用户使用现有帐户登录。我希望将用户定向到一个页面,在页面中填写一些关于它们的额外信息,例如用户名和简短的生物。现在登录后,用户被定向到这个处理程序,如果他们有用户名,我希望他们留在这个页面上,否则我希望他们重定向到/ profile

class Tester(BlogHandler):
    def get(self):
        global visits
        logout = users.create_logout_url(self.request.uri) 

        user = users.get_current_user()
        if user:
            currentregistereduser = None
            try:
                user_db_qry = User.query(User.theid == user.federated_identity())
                user_db_list = user_db_qry.fetch(1)
                #this is the line that is causing the error
                currentregistereduser = user_db_list[0]
            except IndexError:
                #I could do something here to fix it but I am not sure what
            if currentregistereduser:
                if not currentregistereduser.username:
                    self.redirect("/profile")
                else:
                    self.render("tester.html", user=user, logout=logout)

问题是当我尝试在新用户上执行currentregistereduser = user_db_list [0]时我得到一个IndexError但它在现有用户上工作正常。有谁知道是什么原因引起的?我必须在我的/个人资料页面上做相同的事情来识别用户,所以我没有太多帮助,只是将它们重定向到那里。

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是因为您对数据存储区的查询是空的(在您的情况下,对于新用户,这是预期的)。解决这个问题的一种方法是检查列表是否存在,如果存在,则处理:

class Tester(BlogHandler):
    def get(self):
        global visits
        logout = users.create_logout_url(self.request.uri)
        user = users.get_current_user()

        if user:
            currentregistereduser = None
            user_db_qry = User.query(User.theid == user.federated_identity())
            user_db_list = user_db_qry.fetch(1)
            # Check to see if the query returned anything at all - if so, assign
            # the value to currentregistereduser; it not, it will remain None
            if user_db_list:
              currentregistereduser = user_db_list[0]

            if currentregistereduser:
                if not currentregistereduser.username:
                    self.redirect("/profile")
                else:
                    self.render("tester.html", user=user, logout=logout)

        # Assuming the code continues here...