zoukankan      html  css  js  c++  java
  • django-auth认证模块

    ########django-auth认证模块########
    
    auth模块:它是django自带的用户认证模块,帮我们解决了登陆,注册,注销,修改密码
              等等一系列的操作,封装成一个个方法,方便我们使用,用户数据放在auth_user
              表中,学习这个模块就是知道它下面的方法是怎么用。
    
    
    authenticate(request=None, **credentials)
    # 这个方法帮我们验证该用户是否存在,我们要传的参数第一个就是request,其次就是name,password等等,
    # 如果存在的话,将会返回一个该用户对象,存在则会返回None,所以我们可以通过判断它的返回值,进行下步操作
        user = authenticate(request,username='zhuyu',password='123456')
        if user:
            return HttpResponse('验证成功')
        return HttpResponse('验证失败')
    注意:这里的username,password就是User这个表的字段名,所以必须这样写
    
    
    login(request, user, backend=None)
    # 需要注意的是这里的user,是一个校验成功的User对象
    # 这个方法表示登陆成功,方法内部其实也执行了session相关操作,记录登陆状态
        user = authenticate(request,username='zhuyu',password='123456')
        if user:
            auth.login(request,user)
            return HttpResponse('登陆成功')
        return HttpResponse('登陆失败')
    
    
    logout(request)
    # 既然有登陆,那就有注销吧
        auth.logout(request)
        return HttpResponse('注销成功')
    
    
    is_authenticate()
    # 这是request.user方法,用来判断用户是否登陆了没有
    # 那为什么要用is_authenticate()去判断,而不是用if request.user
    # 解释下,在用户没有登陆request.user是有值的,它是一个AnonymousUser对象
    # 所以通过if request.user去去判断是根本不行的,但是取这个对象的username属性判断是可以的
    # 不过我们还是用django给我们方法去判断最好,is_authenticate()的返回值是布尔类型
    
    
    思考:通过web服务端来的request,还没走到中间件之前,你认为他会有user这个属性嘛?
    
    照常来说web服务端(也就是wsgiref那里)只是帮你处理下格式,还有数据,它肯定是不知道这个请求是不是登陆的,
    所以啊,user这个属性肯定是在中间件那层进行逻辑判断,加上去的。
    那么能想到执行auth.login(request,user)它做了些什么?
    下面也伪代码(这里的user校验成功):
            print(request.user)
            auth.login(request, user)
            print(request.user)
    打印结果为:  AnonymousUser
                zhuyu
    
    说明它不单单只是只是设置了session,还把user这个对象赋值给了request.user(大概这样吧,具体肯定复杂吧)
    
    
    login_requierd()
    # 直接讲它就是一个装饰器,实现必须登陆了才能访问该网站
    # 先导入该方法,再直接在那个视图函数上面加上就行了
        from django.contrib.auth.decorators import login_required
        @login_required
        def buy(request):
            return HttpResponse('购买页面')
    
    # 这里也可以指定跳转到那个页面(url)
    方式一:
        @login_required(login_url='/login/')
    
    方式二:
        @login_required  直接调用,不过要在settings那里配置下
        settings文件中:
            LOGIN_URL = '/login/'
    
    
    对了对了,这个auth也是要导入才可以用到
        from django.contrib import auth
    
    
    create_user()和create_superuser()
    # 这个应该早点写,必须是要先有用户才能注册(我的锅)
    # 创建一个新的对象,就是执行create类似操作对吧
    from django.contrib.auth.models import User
    User.objects.create_user(username='张昊',password='zh123456')
    User.objects.create_superuser(username='伍洋',password='wy123456')
    
    # 第一句就是创建一个普通用户
    # 第二句就是创建一个超级用户
    
    
    check_password()
    # 验证密码是否正确
    # 应用场景就是修改密码的时候,需要用户先输入原密码
    # 它的返回值就是布尔类型
    ret = request.user.check_password('密码')
    
    
    set_password()
    # 验证输入的密码是和原密码匹配的话,
    # 那就是开始修改密码了
    request.user.set_password('新密码')
    request.user.save()
    注意:1、这里必须要save一下
         2、这里万万不可以用update方法,因为数据库的密码是加密后的,虽然你可以保存到数据库,
            但是呢?你从数据库取出来的话,密码会显示不正确。
         3、还有就是创建用户,和超级用户,必须用create_user,和create_superuser,原因和上面一样
    
    request.user其他属性
    User对象属性:username, password
    is_staff : 用户是否拥有网站的管理权限.
    is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。
    
    
    疑问:单单一个User表肯定是不能满足我们的需求的,所以需要为它关联表
    方式一:
        在models文件中,导入auth中的User表就好了,关联方法和之前一样,不多说
    
    方式二:
        就是继承User类(表),
        1、首先肯定是要导入 from django.contrib.auth.models import User,AbstractUser
        2、去看User表,就应该知道它也没有写什么,也是继承AbstractUser,所以我们直接继承AbstractUser就行
        3、继承完毕后,需要在settings文件指定原来User表,现在使用你所建立的
    
    models文件:
        class Userinfo(AbstractUser):
            phone = models.CharField(max_length=11, null=True, unique=True)
    
    在settings文件中:
        AUTH_USER_MODEL = "app名.UserInfo"
    
    
    好了,今天到这里!!
  • 相关阅读:
    linux 下spyder安装
    【C++】fill函数,fill与memset函数的区别
    【tensorflow使用笔记一】:安装linux下tensorflow环境的问题
    leetcode 49 字母异位词分组
    leetcode 1014. 在 D 天内送达包裹的能力
    【C++进阶:STL常见性质3】
    【C++进阶:STL常见性质2】
    【C++进阶:STL常见性质】
    【C++进阶:移位运算符的用法】
    面向对象之静态方法
  • 原文地址:https://www.cnblogs.com/zhuchunyu/p/10021370.html
Copyright © 2011-2022 走看看