Django身份验证后端返回多个状态值
我正在编写自定义身份验证后端(和自定义用户模型),以检查用户帐户是否已锁定或过期。我看到在所有身份验证示例中,后端返回值要么是用户对象,要么是无。生成的唯一异常是User.DoesNotExist 我的问题是,我应该如何返回不同的结果(例如,帐户已锁定或过期,或者已达到登录尝试的最大次数) 我应该提出自定义异常还是有其他方法 我使用的是Django 1.5alpha 编辑: 我需要获得多个状态以向用户显示适当的消息并重定向到适当的视图 如文件中所述: 无论哪种方式,authenticate都应该检查它获取的凭据,如果凭据有效,它应该返回与这些凭据匹配的用户对象。如果它们无效,则应返回None 已锁定、过期或已达到最大登录尝试次数的帐户将被视为“无效”,因此应针对这些情况返回Django身份验证后端返回多个状态值,django,authentication,login,custom-backend,Django,Authentication,Login,Custom Backend,我正在编写自定义身份验证后端(和自定义用户模型),以检查用户帐户是否已锁定或过期。我看到在所有身份验证示例中,后端返回值要么是用户对象,要么是无。生成的唯一异常是User.DoesNotExist 我的问题是,我应该如何返回不同的结果(例如,帐户已锁定或过期,或者已达到登录尝试的最大次数) 我应该提出自定义异常还是有其他方法 我使用的是Django 1.5alpha 编辑: 我需要获得多个状态以向用户显示适当的消息并重定向到适当的视图 如文件中所述: 无论哪种方式,authenticate都应该
None
基本上,每当登录被拒绝访问时(无论出于何种原因),都应该返回
None
。如果有人有同样的问题,我会这样做
class UserNotActivatedError(Exception):
pass
class UserLockedError(Exception):
def __init__(self, remaining_mins):
self.remaining_mins = remaining_mins
# backend
def authenticate(self, email=None, password=None):
if email is None or password is None:
return None
try:
user = ExtUser.objects.get(email=email)
user.last_login_attempt_at = timezone.now()
if not use.is_active:
raise UserNotActivatedError
if user.is_locked:
# Check when it was locked and found the duration
sec_to_go = user.get_remaining_locktime()
if sec_to_go:
raise UserLockedError(sec_to_go)
if user.check_password(password):
user.last_login_at = timezone.now()
return user
else:
return None
except User.DoesNotExist:
return None
然后在登录表单中,您可以捕获这些错误,并将适当的验证错误传递给视图 谢谢。知道这一点很有帮助。但我仍然需要来自Authenticate方法的多个状态来显示适当的消息和视图。我用这些信息编辑了我的问题。