四.2登录之多账号登录

# 多账号登录
- 说明:在登录页面,用户文本框中,可以填写用户名,也可以填写手机号,密码一样,完成登录
- 分析:查询
  - 如果是用户名,则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

猜你喜欢

转载自www.cnblogs.com/dbslinux/p/12196007.html