Python django中的简单身份验证系统失败

Python django中的简单身份验证系统失败,python,django,authentication,Python,Django,Authentication,我正在编写一个简单的身份验证系统来登录(和注销)用户。用户名是一个电子邮件地址,用于查找电子邮件字段 我正在使用: user = User.objects.get(email__exact=email) # if user obj exists if user: # if authenticate if authenticate(user, email, password): # create session request.session['us

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

我正在使用:

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. 用户匹配查询不存在。
我所要做的就是查看该查询是否与结果匹配。如何计算行数?

使用
filter()
而不是
get()

使用
filter()
而不是
get()
我想这可能更符合您的要求:

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)
或致电:

前一种方法(
len
)如果您已经评估了
QuerySet
(因为它只是有效地计算列表中的项目数),则速度会更快;如果您没有计算
查询集
,后者(
count()
)会更快,因为Django将在幕后执行
选择计数(*)
,并且您可以避免将所有数据加载到内存中


顺便提一下,如果电子邮件地址不匹配,为什么要将他们定向到
/home/
;如果他们的凭据不匹配,为什么要将他们定向到
/home/login/
?我认为将它们重定向到同一位置对于这两种情况更有意义。

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

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)
或致电:

前一种方法(
len
)如果您已经评估了
QuerySet
(因为它只是有效地计算列表中的项目数),则速度会更快;如果您没有计算
查询集
,后者(
count()
)会更快,因为Django将在幕后执行
选择计数(*)
,并且您可以避免将所有数据加载到内存中


顺便提一下,如果电子邮件地址不匹配,为什么要将他们定向到
/home/
;如果他们的凭据不匹配,为什么要将他们定向到
/home/login/
?对于这两种情况,我认为将它们重定向到同一个位置更有意义。

我使用user=user.objects.filter(email\uu-exact=email)[0]将记录集限制为仅一条记录。如果记录不存在,这样索引查询集将引发异常。我使用user=user.objects.filter(email\uu-exact=email)[0]相反,将记录集限制为仅一条记录。如果记录不存在,则这样索引查询集将引发异常。忘记:after except User.DoesNotExistMe,但您的解决方案是最好的。谢谢。我将“if authentic….else….Redirect('/home/login/')行移到try:语句之外。似乎有同样的效果,更有意义。这样做明智吗?@dotty-在我看来没问题,而且它的优点是将
try
except
移得更近。忘记:after except User.DoesNotExistMe,但您的解决方案是最好的。谢谢。我将“if authentic….else….Redirect('/home/login/')行移到try:语句之外。似乎有同样的效果,更有意义。这样做明智吗?@dotty-在我看来不错,它的优点是将
try
移动得更近。