重写django user验证方式

重写可以定义多种登录方式:如邮箱+密码形式, 用户名+密码的形式…

本文前提: models中 UserProfile需要继承AbstractUser

— 如:(modles.py)

from django.contrib.auth.models import AbstractUser

class UserProfile(AbstractUser):
    nick_name = models.CharField(max_length=50, verbose_name=u'昵称', default=u'')
    birthday = models.DateField(verbose_name=u'生日', null=True, blank=True)
    gender = models.CharField(choices=(('male', u'男'), ('female', u'女')), default=u'female', max_length=6)
    address = models.CharField(max_length=100, default=u'')
    mobile = models.CharField(max_length=11, null=True)
    image = models.ImageField(upload_to='image/%Y/%m', default=u'image/default.png', max_length=100)

–settings.py

修改为自定义的model

UTH_USER_MODEL = "users.UserProfile"  #修改为自定义的model

1. 验证和登录

  • 使用authenticate验证用户是否存在

— 用法概括

from django.contrib.auth import authenticate
user = authenticate(username=user_name, password=pass_word)

— 举例

from django.contrib.auth import authenticate
user_name = request.POST.get('username')
pass_word = request.POST.get('password')
# 验证用户的合法性(authenticate)
user = authenticate(username=user_name, password=pass_word)

  • 登录, 使用自带的login
from django.contrib.auth import login
...
user = authenticate(username=user_name, password=pass_word)
if user is not None:
    login(request, user)
...

2. 自定义登录验证的方式

  • 自定义登录验证方式
    — 重写django.contrib.auth.backends下的authenticate方法, 此处添加邮箱登录验证的方式
from django.contrib.auth.backends import ModelBackend

class CustomBackend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username) | Q(email=username))
            if user.check_password(password):
                return user

        except Exception as e:
            return None
  • 而此时, 登录验证的调用的步骤也不会随之改变, 方便.
user = authenticate(username=user_name, password=pass_word)
        if user is not None:
            pass

  • 在settings.py 添加自定义的验证方式路径字符串
AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',
)

猜你喜欢

转载自blog.csdn.net/weixin_35993084/article/details/80742627