Django之auth模块
1.auth模块介绍
需要使用auth模块需要导入
from django.contrib import auth
auth模块用作django的用户认证,具有非常简便高效的用法,通常情况下的用户认证需要借助于django的session(cookie),用户登入后给用户设置session值,从而用户的访问带着设置的session值来访,以此来保证用户的会话,用法如下:
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
print(username,password)
# 验证用户输入,如果验证通过,则返回用户对象
user = auth.authenticate(username=username,password=password)
if user:
request.session['username'] = user.username
return redirect('/index/')
else:pass
return render(request,'login.html')
如上所示,使用了auth模块的认证功能auth.authenticate(需要认证的字段)
返回的是认证用户的对象,但是session还是自己手工写的。
进一步使用auth.login(request,user),把user对象封装到request中,且自动设置session
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
print(username,password)
# 验证用户输入,如果验证通过,则返回用户对象
user = auth.authenticate(username=username,password=password)
if user:
auth.login(request, user)
return redirect('/index/')
return render(request,'login.html')
2.认证后的相关
设置指定页面认证后才能访问,方法一:
使用装饰器的方法指定访问指定视图函数需要通过认证,需要导入模块
from django.contrib.auth.decorators import login_required
# 验证用户是否登入方法1
@login_required(login_url="/login/")
def index(request):
return render(request,'index.html',{"request":request})
方法二
使用**is_authenticated()**方法进行认证验证
def index(request):
if request.session.get("username"):
print(request.session.get("username"))
if request.user.username:
print(request.user.username)
# 判断是否是已登入用户--方法2
if request.user.is_authenticated():
return render(request,'index.html')
else:return redirect('/login/')
return render(request,'index.html',{"request":request})
3.此外还提供了校验密码和修改密码的方法
auth.login()方法将用户对象user封装到了request中,校验方法为
request.user.check_password(password)
修改密码的方式为
request.user.set_password(newPassword)
request.user.save()
4.auth模块实现登入注册修改密码小案例
4.1.视图函数
from django.shortcuts import render,redirect
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from app01 import models
# Create your views here.
def login(request):
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
print(username,password)
# 验证用户输入,如果验证通过,则返回用户对象
user = auth.authenticate(username=username,password=password)
# if user:
# request.session['username'] = user.username
# return redirect('/index/')
# else:pass
# auth提供一个login方法,将user封装到request.user中,并设置session
if user:
auth.login(request, user)
return redirect('/index/')
return render(request,'login.html')
# 验证用户是否登入方法1
@login_required(login_url="/login/")
def index(request):
# if request.session.get("username"):
# print(request.session.get("username"))
# if request.user.username:
# print(request.user.username)
# 判断是否是已登入用户--方法2
# if request.user.is_authenticated():
# return render(request,'index.html')
# else:return redirect('/login/')
return render(request,'index.html',{"request":request})
def logout(request):
auth.logout(request)
return redirect('/login/')
def register(request):
if request.method == "POST":
#User.objects.create_user(username="monitor",email="monitor@xingyao.com",password="mon_1234")
username = request.POST.get("username")
password = request.POST.get("password")
email = request.POST.get("email")
models.UserInfo.objects.create_user(username=username,password=password,email=email)
return redirect('/login/')
return render(request,'register.html')
@login_required(login_url="/logout/")
def changePassword(request):
if request.method == "POST":
password = request.POST.get("password")
newPassword = request.POST.get("newPassword")
if password:
if request.user.check_password(password):
print("修改密码为:%s" %(newPassword))
request.user.set_password(newPassword)
request.user.save()
return render(request,"changePassword.html")
5.扩展默认的auth_user表
默认的用户认证表字段有限,并不一定能够满足需求,需要对默认的表进行扩展,扩展的方式有两种
方式一:新建一张表,将扩展字段写在新表中,为新表和auth_user表创建一对一关系
方式二:使用继承的方式
app应用的models.py中定制新表
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
# 扩展auth模块默认使用的auth_user表,增加以下字段
class UserInfo(AbstractUser):
phone = models.CharField(max_length=11)
address = models.CharField(max_length=50)
settings.py模块中设置使用自定义扩展表用作用户认证
# 使用继承方式扩展auth默认用户认证使用的表,配置如下,会自动在app01下的models.py模块中寻找UserInfo表
AUTH_USER_MODEL = 'app01.UserInfo'