自定义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')
Fake it,till you make it