# 多账号登录 - 说明:在登录页面,用户文本框中,可以填写用户名,也可以填写手机号,密码一样,完成登录 - 分析:查询 - 如果是用户名,则filter(username字段和用户填的值做对比) - 如果是手机号,则filter(mobile字段和用户填的值做对比) - 实现:自定义类,继承自Backend,重写authenticate()方法
1.指定认证后端--https://yiyibooks.cn/qy/django2/topics/auth/customizing.html
apps/users/views.py中LoginView类中:此前直接用的是django的认证模块authenticate方法---但是此方法中无多帐号查询语句,所以我得自己写多条件查询语句,那我得怎么做?--django官方文档.
settings/dev.py中添加:
#指定认证后端
AUTHENTICATION_BACKENDS = ['meiduo_mall.utils.authenticate.MeiduoModelBackend']
2.自定认证后端:
建utils/authenticate.py:from django.contrib.auth.backends import ModelBackend #导入modelbackend类import rfrom users.models import Us
class MeiduoModelBackend(ModelBackend):
#重写authenticate方法---原只是根据用户名作查询,现在改写成即可手机号又可用户名查询 def authenticate(self, request, username=None, password=None, **kwargs): # 变量username的值,可以是用户名,也可以是手机号,需要判断,再查询 try:#查用户对象无则抛异常---即在两个字段上作查询 #if re.match(r'^1[3-9]\d{9}$', username):#手机号的正则与username变量作对比 # user = User.objects.get(mobile=username)#查询 #else: # user = User.objects.get(username=username)
#不做正则式的判断,直接用username变量/用户输入的值去查是匹配username还是mobile字段
user = User.objects.get(username=username)
except: # 如果未查到数据,则返回None,用于后续判断
try:
#再接着查
user = User.objects.get(mobile=username)
except:
return None
# 判断密码--check_password是django官方方法 if user.check_password(password): return user else: return None
效果如下图:实现多帐号登录了--用手机号也可登录
1
2
3
4
5