auth模块
auth是Django提供用来用户认证的模块,它默认用auth_user表来存放用户,Django执行数据库迁移命令的时候,会自动创建很多表,其中就有auth_user表
auth模块提供的方法
1、创建超级用户的方法:
命令创建:python manage.py createsuperuser (注意:该方法可以不写邮箱地址)
代码创建:(1) from django.contrib.auth.models import User 导入模块
(2)user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)(必须要有邮箱)
2、登陆验证方法:authenticate()
'''
该方法需要用户跟密码两个参数,缺一不可
验证成功会返回一个User对象
'''
User_obj=auth.authenticate(request,username=username,password=password)
3、保存用户状态: auth.login(request,user_obj)
auth.login(request,User_obj)
'''
等价于request.session['key']=User_obj
执行该方法后,就可以通过request.user来获取当前登陆的用户对象
'''
4、判断用户是否登陆:is_authenticated()
request.user.is_authenticated()
'''
该方法返回的是布尔值
'''
5、获取当前用户对象:request.user
request.user #用户对象
'''
用户对象属性:
username: 用户名
password: 密码
is_staff : 用户是否拥有网站的管理权限.
is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录
'''
6、校验用户是否登陆的装饰器:@login_required(login_url='跳转链接')
from django.contrib.auth.decorators import login_required
#局部配置:直接在方法上面引入
@login_required(login_url='/login')
def xxx(reqeust):
pass
#全局配置:在配置文件settings中添加一句代码
LOGIN_URL='/login/'
'''
注意:局部配置跟全局配置同时存在的时候,
局部配置的优先级大于全局配置
'''
7、修改密码用到的密码验证、跟密码修改方法:
#旧密码的校验:check_password
request.user.check_password('oldpassword')
#密码修改 :set_password
request.user.set_password(new_passwd)
request.user.save()
'''
注意:密码修改后必须调用用户对象的save()方法,才能完全实现数据库的修改操作。
'''
8、注销功能:auth.logout(request)
auth.logout(request)
'''
该方法会清除用户的session登陆信息
'''
9、注册功能:create_user()
from django.contrib.auth.models import User
User.objects.create_user(username=username,password=password)
'''
create_user方法:会自动给密码加密
'''
扩展默认auht_user表的字段
from django.db import models
from django.contrib.auth.models import AbstractUser
class My_User(AbstractUser):
'''
注意:继承了AbstractUser后,在执行数据库迁移命令的时候
auth_user表将不会被创建出来,而是直接创建My_User表
My_User表中包含auth_user表中的所有字段,同时还有我们自己添加的字段
该方法前提条件:
1、在继承AbstractUser之前没有执行数据库迁移命令
如果auth_user表已被创建,那么只能换数据库操作
2、继承的类里面不用覆盖AbstractUser里面的字段名
即:扩展字段名不要跟AbstractUser里面的字段名一致
3、需要在配置文件告诉Django你要用My_User替代auth_user表
AUTH_USER_MODEL='应用名。表名‘
如:AUTH_USER_MODEL='app01。My_User‘
'''
phone=models.BigIntegerField()
注意:需要在配置文件声明一下AUTH_USER_MODEL='应用名.表名‘
def login(request):
url=request.GET.get('next')
if request.method=='POST':
username=request.POST.get('username')
password=request.POST.get('password')
res=auth.authenticate(request,username=username,password=password)
print(res.username,res.password)
if res:
auth.login(request,res)#等价于request.session['key']=res
if url:
return redirect(url)
else:
return redirect('/home/')
return render(request,'login.html',locals())
#注册功能
def regist(request):
if request.method=='POST':
username=request.POST.get('username')
password=request.POST.get('password')
confirm=request.POST.get('confirm')
if password==confirm:
#注册用户
User.objects.create_user(username=username,password=password)
return redirect('/login/')
return render(request,'regist.html')
#局部配置
@login_required(login_url='/login/')
def home(request):
#is_authenticated用来判断用户是否登陆
if request.user.is_authenticated():
return render(request,'home.html')
else:
return redirect('/login/')
#修改密码
@login_required()
def set_passwd(request):
user_obj=request.user#用户对象
if request.method=='POST':
username=request.POST.get('username')
passwd=request.POST.get('old_password')
new_passwd=request.POST.get('new_password')
confirm=request.POST.get('confirm')
is_passwd=request.user.check_password(passwd)
if is_passwd:
if new_passwd==confirm:
request.user.set_password(new_passwd)
request.user.save()
return redirect('/login/')
return render(request,'set_passwd.html',locals())
#注销
@login_required
def zhuxiao(request):
#清除用户的登陆信息
auth.logout(request)
return HttpResponse('注销成功')