django中简单的auth系统失败了

时间:2010-02-10 16:45:30

标签: python django authentication

我正在编写一个简单的auth系统来登录(和注销)用户。用户名是一个电子邮件地址,用于查找电子邮件字段。

我正在使用:

user = User.objects.get(email__exact=email)
# if user obj exists
if user:
    # if authenticate
    if authenticate(user, email, password):
        # create session
        request.session['user'] = user
        # redir
        return HttpResponseRedirect('/home/')
    else:
        return HttpResponseRedirect('/home/login/')
# no user obj found? (no email found actually)
else:
    # redir
    return HttpResponseRedirect('/home/')

查找用户是否存在,但是如果找不到用户,则Django会抛出错误:

User matching query does not exist.

我想要做的就是查看该查询是否与结果匹配。我如何计算行?

2 个答案:

答案 0 :(得分:2)

使用filter()代替get()

答案 1 :(得分:1)

我认为这可能更符合您的要求:

try:
    user = User.objects.get(email__exact=email)
    if authenticate(user, email, password):
        request.session['user'] = user
        return HttpResponseRedirect('/home/')
    else:
        return HttpResponseRedirect('/home/login/')
except User.DoesNotExist: # A user with the e-mail provided was not found
    return HttpResponseRedirect('/home/')

就我个人而言,我认为这比伊格纳西奥的方法更清洁,但这确实是一个品味问题。

最后,问题的最后一部分(“我如何计算行?”):

get只返回一个对象,如果没有对象与您传入的条件匹配,或者多个对象符合条件,则会引发异常。要获得QuerySet中的对象数量,您只需在其上调用len

q = User.objects.filter(email = 'foo@bar.com')
print len(q)

或者,致电count()

print User.objects.filter(email = 'foo@bar.com').count()

如果您已经评估了len(因为它只是有效地计算列表中的项目数),前一种方法(QuerySet)会更快;如果你没有评估count(),后者(QuerySet)会更快,因为Django将在幕后执行SELECT COUNT(*),并且你避免将所有数据加载到内存中。 / p>

顺便说一句 - 如果电子邮件地址不匹配,为什么要将它们指向/home/,如果其凭据失败,为什么指示/home/login/?我认为将这两种情况重定向到同一个地方更有意义。