diango—auth模块
1、什么是auth模块
1、auth模块是django自带的用户认证模块
2、内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据
3、提供了对auth_user表的注册、登陆、认证、注销、修改密码等功能
2、常用方法
导入模块
from django.contrib import auth
from django.contrib.auth.models import User
# User继承了AbstractUser,在AbstractUser中有auth_user表的字段定义
from django.contrib.auth.decorators import login_required
# 装饰器:校验是否登陆
1、创建用户
def register(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# models.User.objects.create(username=username,password=password)
# User.objects.create(username=username,password=password) # 不可用 密码不是加密的
# User.objects.create_user(username=username,password=password) # 创建普通用户 密码自动加密
# User.objects.create_superuser(username=username,password=password,email='123@qq.com') # 创建超级用户 需要邮箱数据
return HttpResponse('OK')
return render(request,'register.html')
2、校验用户名和密码是否正确
# username和password两个参数,缺一不可
user_obj = auth.authenticate(request,username=username,password=password)
3、保存用户登陆状态
# 执行此代码,代替你完成cookie/session操作,保存用户状态
auth.login(request,user_obj)
4、判断当前用户是否登陆
# 用当前已保存的登陆用户request.user执行方法,判断是否仍然登陆者
request.user.is_authenticated()
5、校验原密码是否正确
# 有的操作需要用到确认原密码的操作,如修改密码
request.user.check_password(old_password)
6、修改密码
# 一般与check_password联用
request.user.set_password(new_password)
request.user.save() # 更新到数据库,必不可少
7、注销
# 秩序执行此代码就可实现注销用户
auth.logout(request)
8、检验用户是否登陆的装饰器
from django.contrib.auth.decorators import login_required
# 局部配置
@login_required(login_url='/login/')
def index(request):
pass
# 全局配置
# settings配置文件中 直接配置
LOGIN_URL = '/login/'
@login_required
def index(request):
pass
# 如果全局配置了 局部也配置 以局部的为准
3、扩展auth_user表
注意点:
1、如果要保持扩展之后的auth_user表仍然拥有auth模块的强大功能,必须在扩展之后再使用数据库迁移同步命令,创建真正的表
2、在定义完扩展表之后,如果是继承的方式,那么将要使用auth模块功能的表不在是User,需要到settings.py文件中将配置改成扩展之后的表
AUTH_USER_MODEL = 'app01.Userinfo' # 应用名.表名
# 在settings.py中添加这条语句之后,由于django配置文件加载的特点,将会覆盖django的全局配置中的AUTH_USER_MODEL
1、利用一对一外键字段关系
from django.contrib.auth.models import User
# auth_user是创建完成之后,在数据库中的真实的表
# 但是在django中对应的模型表类是User,因此要将User导入到models.py中,才能与之建立外键
class UserDetail(models.Model):
# 注意,不要定义User表中已有的字段
phone = models.BigIntegerField()
user = models.OneToOneField(to='User')
2、利用继承关系
from django.contrib.auth.models import AbstractUser
'''
1、User表继承于AbstractUser,字段真正定义的地方是在AbstractUser
2、此处也可以用User表
3、继承关系扩展表,需要在settings.py文件中添加配置AUTH_USER_MODEL = 'app01.Userinfo'
'''python
class Userinfo(AbstractUser):
phone = models.BigIntegerField()
register_time = models.DateField(auto_now_add=True)
# 注意,此处不能继承User,涉及到基表的概念,如下
3、基表
from django.db import models
'''
1、在模型表中定义类种类Meta,设置属性abstract = True
2、基表为抽象表,是专门用来被继承,提供共有字段的,自身不会完成数据库迁移
3、直接继承基表的类,在数据库迁移时,才会创建基表中的字段
'''
class BaseModel(models.Model):
is_delete = models.BooleanField(default=False)
created_time = models.DateTimeField(auto_now_add=True)
class Meta:
abstract = True
class Book(BaseModel):
pass
class Publish(BaseModel):
pass