Database 谷歌应用引擎:在注册过程中检查用户是否存在

Database 谷歌应用引擎:在注册过程中检查用户是否存在,database,google-app-engine,Database,Google App Engine,我有一个小的注册页面,我正在努力工作。基本上你给你的用户名、密码和电子邮件,然后如果你输入的用户名不存在,它会将你重定向到一个欢迎页面,上面写着“欢迎(这里的用户名)!”。如果用户确实存在,则会重新呈现注册页面。问题是,即使用户不存在,它也会不断重新呈现注册页面。我没有错误。检查用户是否存在的函数“getByName”会不断返回true。有人能看到这个问题吗 下面是调用“getByName”函数的代码 if(username and password and verify and ema

我有一个小的注册页面,我正在努力工作。基本上你给你的用户名、密码和电子邮件,然后如果你输入的用户名不存在,它会将你重定向到一个欢迎页面,上面写着“欢迎(这里的用户名)!”。如果用户确实存在,则会重新呈现注册页面。问题是,即使用户不存在,它也会不断重新呈现注册页面。我没有错误。检查用户是否存在的函数“getByName”会不断返回true。有人能看到这个问题吗

下面是调用“getByName”函数的代码

    if(username and password and verify and email):
        if UserInfo.getByName(username) == True:
            self.renderSignup()
        else:
            UserInfo.register(username, password, email)
            cookieVal = str(encrypt.makeCookieHash(username))
            self.response.headers.add_header("Set-Cookie", "username=%s; Path=/" % (cookieVal))
            self.redirect("/welcome")
    else:
        self.renderSignup(username, email, usernameError, passwordError, verifyError, emailError)
下面是包含“getByName”函数和其他函数的“UserInfo”数据模型

class UserInfo(db.Model):
    passwordHash = db.StringProperty(required = True)
    email = db.StringProperty(required = True)
    username = db.StringProperty(required = True)

@classmethod 
def register(cls, name, password, email):
    encrypt = Encrypt()
    pwHash = encrypt.hashUserInfo(name, password)
    UserInfo(passwordHash = pwHash, email = email, username = name).put()

@classmethod
def getByName(cls,name):
    usersWithName = UserInfo.gql("where username = :1", name)
    if usersWithName != None:
        return True
    return False
台词

usersWithName = UserInfo.gql("where username = :1", name)
if usersWithName != None:
你做比较的地方就是你出错的地方
userWithName
是一个查询对象,您的比较将始终为真。您需要使用get、fetch等执行查询。。。。然后查看结果集是否包含内容

你应该这样做

usersWithName = UserInfo.gql("where username = :1", name).get()
if usersWithName != None:

或者您可以执行一个fetch(10),并检查非空列表。当然,如果您发现超过1项匹配,那么这将表明您的系统中存在更广泛的错误。

我不确定当您说“使用get、fetch……等执行查询”时,我是否在跟踪您。我将如何使用fetch方法来进行适当的比较?请参阅我答案的补充部分。