• django篇--->十(auth模块)


    1.auth模块
    用auth模块 你就用全套 不是自己写一部分 用别人一部分

    如何创建超级用户 用于登录django admin的后台管理
        createsuperuser
        
    校验用户是否存在
        user_obj = auth.authenticate(username=username,password=password)  # 返回的是数据对象  没有返回None
    保存用户登录状态
        auth.login(request,user_obj)  # 执行完这一句之后 只要是能够拿到request的地方 
        # 都可以通过request.user获取到当前登录用户对象
    判断当前用户是否登录
        request.user.is_authenticated()
    获取当前用户数据对象
        request.user
    如何给视图函数加上校验用户是否登录的校验
        from django.contrib.auth.decorators import login_required
        # @login_required(login_url='/xxx/')  # 局部配置
        @login_required  # 全局配置
        def home(request):
            return HttpResponse('home页面')
            # 当用户没有登录的情况下 跳转的url有两种配置方式
            1.在装饰器括号内通过login_url参数局部指定
            
            2.全局配置  用户没有登录的情况下 所有的视图统一跳转到一个url
            配置文件中
                LOGIN_URL = '/login/'
    修改密码
        校验原密码是否正确
            is_right = request.user.check_password(old_password)
        设置新密码
            request.user.set_password(new_password)
            request.user.save()
    

    代码

    from django.contrib import auth
    def login(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            # 判断用户信息是否正确
            # 现在我们自己没有建表,用的是django自带的 auth_user表,所有用不了之前所学的用 models.User.object.filter().first()数据库方法
            # 解决方法:既然用的是 auth_user 表,那就用auth模块来处理
            user_obj = auth.authenticate(username=username, password=password)  # 该方法条件满足返回一个数据对象,条件不满足返回None
            print(user_obj)
            # 这里不能使用filter方法,因为表中密码数据是密文的,用filter获取的信息是明文的,这样后面,一个是密文一个是明文,在比对时就不能正常比对
            if user_obj:
                print(user_obj.username)
                print(user_obj.password)
                # 通过认证后一定要记录用户状态,才算真正的用户登录
                auth.login(request, user_obj)
                '''
                该方法会主动帮你操作session表,将用户状态记录到session表中,并且只要执行了该方法,你就
                可以在任何位置通过request.user获取当前登录的用户对象
                '''
                old_path = request.GET.get('next')  # 获取用户上一次要访问的地址
                if old_path:
                    return redirect(old_path)
                else:
                    return redirect('/home/')
        return render(request, 'login.html')
    
    from django.contrib.auth.decorators import login_required
    
    @login_required(login_url='/login/')
    def index(request):
        return HttpResponse('index')
    
    
    @login_required(login_url='/login/')
    def set_password(request):
        if request.method == 'POST':
            old_password = request.POST.get('old_password')
            new_password = request.POST.get('new_password')
            # 校验原密码对不对
            is_right = request.user.check_password(old_password)
            if is_right:
                request.user.set_password(new_password) # 设置新密码
                request.user.save()  # 一定要保存
                return redirect('/login/')
        return render(request, 'set_password.html')
    

    注册

    用户注册
            from django.contrib.auth.models import User
            User.objects.create(username=username,password=password)  # 不用使用create 密码会直接存成明文
            User.objects.create_user(username=username,password=password)  # 创建普通用户
            User.objects.create_superuser(username=username,password=password,email='123@qq.com')  # 创建超级用户  邮箱字段必须填写
            
    

    代码

    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)  # 不用使用create 密码会直接存成明文
            # User.objects.create_user(username=username,password=password)  # 创建普通用户
            User.objects.create_superuser(username=username,password=password,email='123@qq.com')  # 创建超级用户  邮箱字段必须填写
    
        return render(request,'register.html')
    

    扩展auth_user表的字段
    第一种(不好用)
    利用一对一表关系 扩展字段

        第二种(继承)
            1.自己写一个默写类 继承原来的auth_user类 然后在settings配置文件中 告诉django使用你新建的类来替代auth_user表
            from django.db import models
            from django.contrib.auth.models import AbstractUser
            # Create your models here.
    
            class Userinfo(AbstractUser):
                """
                强调 你继承了AbstractUser之后 你自定义的表中 字段不能跟原有的冲突
                """
                phone = models.BigIntegerField()
                avatar = models.FileField()
                register_time = models.DateField(auto_now_add=True)
            2.一定要在settings配置文件中指定
                AUTH_USER_MODEL = 'app01.Userinfo'
                # 固定语法: AUTH_USER_MODEL = '应用名.表名'
            
            """
            通过上面的方式 继承的表 还可以继续使用auth模块所有的功能
            """
        
        温馨提示 当你需要些用户相关的功能的时候可以考虑使用auth模块
    

    Auth模块

    一、什么是auth模块

    Auth模块是Django自带的用户认证模块

    Auth模块是Django自带的用户认证模块,可以实现包括用户注册、用户登录、用户认证、注销、修改密码等功能。默认使用 auth_user 表来存储用户数据。

    二、Auth模块使用

    1.创建超级用户 (createsuperuser)

    创建超级用户就是在auth_user表中插入数据,密码是加密的。

    在 Run manage.py Task 创建

    createsuperuser
    

    2.查询用户(authenticate())

    验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。如果认证成功(用户名和密码正确有效),便会返回一个 User 对象

    from django.contrib import auth
    user_obj = auth.authenticate(request, username=name, password=pwd)
    

    不能使用filter这种查询方法,因为user表存的密码是加密的

    models.User.objects.filter(username=username,password=password).first()
    

    3.登录用户(login())

    该函数接收一个HttpRequest对象,以及一个经过查询认证的user_obj

    登录之后,会将用户状态记录到session中

    from django.contrib import auth
    
    auth.login(request,user_obj)
    

    4.登录成功

    只要执行了上面那句话登录成功,你就可以在后端任意位置通过request.user获取到当前用户对象

    user_obj = request.user
    

    5.判断用户是否登录(is_authenticated)

    用来判断当前请求是否通过了认证,如果通过就是true,反之false

    request.user.is_authenticated
    

    6.登录认证装饰器

    快捷的给某个视图添加登录校验。

    若用户没有登录,则会跳转到django默认的登录URL'/accounts/login/',并传递当前访问url的绝对路径(登录成功后,会重定向回到该路径)

    如果自定义了登录URL,则需要在settings.py文件中通过LOGIN_URL 设置登录路径

    from django.contrib.auth.decorators import  login_required
    
    @login_required(login_url='/xxx/')  # 局部配置 直接在装饰器里面写一个登录路径
    def index(request):
        pass
        
               
    # 全局配置  settings文件中写  
    LOGIN_URL = '/xxx/'
    设置完后直接写装饰器 @login_required 就可以
    

    7.注册超级用户和普通用户

    错误方法:User.objects.create(username =username,password=password)  # 创建用户名的时候 千万不要再使用create 了
    User.objects.create_user(username =username,password=password)  # 创建普通用户
    User.objects.create_superuser(username =username,password=password,email='123@qq.com')  # 创建超级用户  邮箱必填
    

    8.校验密码(check_password())

    #校验密码
    request.user.check_password(old_password)
    

    9.修改密码(set_password())

    注意:修改密码的时候,一定要save保存,否则不会生效

    request.user.set_password(new_password)
    request.user.save()
    

    10.退出登录(logout())

    当调用该函数时,当前请求的session信息会全部清除,相当于request.session.flush().该用户即使没有登录,使用该函数也不会报错

    auth.logout(request)
    

    11.User对象的其他属性

    # 在网站上线以前,将is_active和is_staff设置为False
    is_active    # 禁止登录网站(用户还存在,封号)
    is_staff    # 是否对网站有管理权限(能不能登录admin)
    
    request.user.is_active = False
    request.user.is_staff = False
    

    三、自定义auth_user表

    1.方法一:定义一个表模型,跟User一对一关联(不推荐使用)

    from django.contrib.auth.models import User
    
    class UserDetail(models.Model):
        phone=models.CharField(max_length=32)
        # 一对一跟auth_user表做关联
        # 如果是从外部引入的表模型,是不能加引号的
        # 如果加引号,只是在当前model找
        user=models.OneToOneField(to=User)
    

    2.方法二:使用类的继承,继承(AbstractUser)

    from django.contrib.auth.models import AbstractUser
    
    class Userinfo(AbstractUser):
        # 千万不要跟原来表中的字段重复 只能创新
        phone = models.BigIntegerField()
        avatar = models.CharField(max_length=32)
    

    注意:

    1.一旦我们通过继承来实现扩展auth_user表,那么做数据库迁移,以后就没有auth_user这个表了,以后认证组件用的表就是UserInfo。原来使用 auth_user 表模型的地方全部要用新的表模型——UserInfo(这个是你自定义的模型类)
    
    2.告诉django不再使用auth默认的表,而是使用你自定义的表,需要在settings.py中设置
    AUTH_USER_MODEL = 'app01.Userinfo'   '应用名.类名'
    
  • 相关阅读:
    java中ant包中的org.apache.tools.zip实现压缩和解压缩
    velocity.properties配置说明
    序列化人人网框架下的DAO?也就是在Spring下序列化DAO的问题(spring+quartz集群下)
    vue-cli使用sockjs即时通信
    VUE温习:nextTick、$refs、嵌套路由、keep-alive缓存、is特性、路由属性用法、路由钩子函数
    win7下Google谷歌浏览器上传下载卡死无响应
    微信支付开发流程
    阿里云视频点播同层播放问题
    微信小程序 scroll-view 实现锚点跳转
    解决微信小程序ios端滚动卡顿的问题
  • 原文地址:https://www.cnblogs.com/chmily/p/11777818.html
Copyright © 2020-2023  润新知