自定义Django中自带的用户与用户认证

自定义用户:

写一个继承自AbstractUser的类,然后追加自己需要的字段,比如新增电话号码和年龄字段

在settings.py加入AUTH_USER_MODEL = 'app的名字.用户类'

models:

class MyUser(AbstractUser):
    phone = models.CharField(max_length=13)
    age = models.IntegerField(null=True)

然后进行迁移,若之前进行过迁移会报错,需要删除迁移记录与已创建的表,重新进行迁移。

在app的目录下新键一个文件 auth.py,写一个继承自ModeBackend的类,复写authenticate函数(根据姓名或者电话号码查找对象,然后校验密码)。

在settings.py里设置:AUTHENTICATION_BACKENDS=("app的名字.文件名字.类",)

auth.py:

from django.contrib.auth.backends import ModelBackend

from .models import MyUser

class MyBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = MyUser.objects.get(username=username)
        except Exception:
            try:
                user = MyUser.objects.get(phone=username)
            except Exception:
                return None

        # 密码校验
        if user.check_password(password):
            return user
        else:
            return None

views函数(首页,登录,注册,登出):

from django.contrib.auth import authenticate, login,logout
from django.contrib.auth.models import User
from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse


def index(req):
    user = req.user
    uname = user.username if user.username else '游客'
    return render(req,'new_index.html',{'user_name':uname})


def mylogin(req):
    if req.method == 'GET':
        return render(req,'new_login.html')
    else:
        name = req.POST.get('name')
        pwd = req.POST.get('pwd')
        if len(name) == 0 or len(pwd) == 0:
            return HttpResponse('用户名密码不能为空')
        # 校验用户
        user = authenticate(req,username = name, password = pwd)
        if user is None:
            return HttpResponse('账号或密码错误')
        else:
            login(req,user)
            return redirect('/app2/index')


def register(req):
    if req.method == 'GET':
        return render(req,'register.html')
    else:
        name = req.POST.get('name')
        pwd = req.POST.get('pwd')
        confirm_pwd = req.POST.get('confirm_pwd')
        if pwd and len(pwd) >= 4 and pwd == confirm_pwd:
            if not User.objects.filter(username=name).exists():
                user = User.objects.create_user(username=name,password=pwd)
                return redirect(reverse('app2:mylogin'))
        else:
            return HttpResponse('账号或者密码有误')


def mylogout(req):
    logout(req)
    return redirect('/app2/index')

 

posted @ 2018-10-29 19:33  WuSir_ZJ  阅读(545)  评论(0编辑  收藏  举报