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
和移动得更近。