用户表字段扩展
user 表 构成
系统自动生成的表结构如下:
id : 序号
password : 密码
last_login : 最后一次登录
is_superuser: 是否是超级用户
username : 用户名
first_name :姓
last_name : 名
email : 邮箱
is_staff : 是否是员工,
is_active : 是否激活
date_joined : 注册时间
扩展用户表 – 自定义用户表 UserProfile
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
nick_name = models.CharField('昵称',max_length=50,default='')
...
增加自己所需要的字段后, 需要 注册 app 和 重载 AUTH_USER_MODEL, 所有操作都在 settings.py 中进行
INSTALLED_APPS 中 增加 users
重载 AUTH_USER_MODEL
AUTH_USER_MODEL = 'appname.modelname'
案例: AUTH_USER_MODEL = 'users.UserProfile'
登录接口认证
直接 编写 登录验证接口 视图,
from django.http import JsonResponse
from django.contrib.auth import authenticate, login
from django.views.generic.base import View
class LoginView(View):
def get(self,request):
return render(request, 'login.html')
def post(self,request):
# 获取用户提交的用户名和密码
user_name = request.POST.get('username', None)
pass_word = request.POST.get('password', None)
# 成功返回user对象,失败None
user = authenticate(username=user_name, password=pass_word)
# 如果不是null说明验证成功
if user is not None:
# 登录
login(request, user)
return JsonResponse({"status_code": 0, "status_msg": "登录成功"})
else:
return JsonResponse({"status_code": -1, "status_msg": "用户名或密码错误"})
增加 forms 进行验证
先建 forms.py
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(required=True)
password = forms.CharField(required=True, min_length=5)
视图函数增加 form 验证:
from django.http import JsonResponse
from django.contrib.auth import authenticate, login
from django.views.generic.base import View
from .forms import LoginForm
class LoginView(View):
def get(self,request):
return render(request, 'login.html')
def post(self,request):
login_form = LoginForm(request.POST)
if login_form.is_valid():
# 获取用户提交的用户名和密码
user_name = request.POST.get('username', None)
pass_word = request.POST.get('password', None)
# 成功返回user对象,失败None
user = authenticate(username=user_name, password=pass_word)
# 如果不是null说明验证成功
if user is not None:
# 登录
login(request, user)
return JsonResponse({"status_code": 0, "status_msg": "登录成功"})
else:
return JsonResponse({"status_code": -1, "status_msg": "用户名或密码错误"})
else:
return JsonResponse({"status_code": -1,"status_msg":login_form})
增加支持 邮箱 登录验证
from django.contrib.auth.backends import ModelBackend
from .models import UserProfile
from django.db.models import Q
#邮箱和用户名都可以登录
# 基础ModelBackend类,因为它有authenticate方法
class CustomBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
# 不希望用户存在两个,get只能有一个。两个是get失败的一种原因 Q为使用并集查询
user = UserProfile.objects.get(Q(username=username)|Q(email=username))
# django的后台中密码加密:所以不能password==password
# UserProfile继承的AbstractUser中有def check_password(self, raw_password):
if user.check_password(password):
return user
except Exception as e:
return None