Django之Auth用户认证模块

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('注销成功')
autho模块实现登陆、注册、修改、注销的功能

 

 

posted @ 2020-10-11 20:52  NQ31  阅读(198)  评论(0编辑  收藏  举报