Django 用户字段数据扩展及登录接口认证

用户表字段扩展

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值