重写可以定义多种登录方式:如邮箱+密码形式, 用户名+密码的形式…
本文前提: 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',
)