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='应用名.表名‘
ef 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('注销成功')