• Django -- Auth模块


    Auth模块

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

    auth模块方法

    # 1.比对用户名和密码是否正确
    user_obj = auth.authenticate(request,username=username,password=password)
    # 括号内必须同时传入用户名和密码
    print(user_obj)  # 用户对象    数据不符合则返回None
    print(user_obj.username)  
    print(user_obj.password)  # 密码是密文形式
    
    # 2.保存用户状态
    auth.login(request,user_obj)  # 类似于request.session[key] = user_obj
    
    
    # 3.判断当前用户是否登陆
    request.user.is_authenticated()
    
    # 4.获取当前登陆用户
    request.user
    
    # 5.校验用户是否登陆装饰器
    from django.contrib.auth.decorators import login_required
    # 局部配置
    @login_required(login_url='/login/') 
    # 全局配置
    LOGIN_URL = '/login/'
        1.如果局部和全局都有 该听谁的?
        局部 > 全局
        2.局部和全局哪个好呢?
        全局的好处在于无需重复写代码 但是跳转的页面却很单一
        局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面
    
    # 6.比对原密码
    request.user.check_password(old_password)
    
    # 7.修改密码
    request.user.set_password(new_password)  #修改对象的属性
    request.user.save()  #操作数据库
    
    # 8.注销
    auth.logout(request) 
    
    # 9.注册
    # 操作auth_user表写入数据
    User.objects.create(username=username,password=password)  # 写入数据  密码没有加密处理
    # 创建普通用户
    User.objects.create_user(username=username,password=password)# 密码是加密处理的
    # 创建超级用户:使用代码创建超级用户 邮箱是必填的 而用命令创建则可以不填
    User.objects.create_superuser(username=username,email='123@qq.com',password=password)

    例子:

    def login(request):
        if request.method == "POST":
            username = request.POST.get("username")
            pwd = request.POST.get("password")
            obj = auth.authenticate(request, username=username, password=pwd)
            print(obj)
            print(obj.username)
            print(obj.password)
            if obj:
                auth.login(request, obj)
                return redirect("/home/")
        return render(request, "login.html")
    login
    @login_required
    def home(request):
        print(request.user)
        print(request.user.is_authenticated())
        return HttpResponse("ok")
    home
    @login_required
    def set_pwd(request):
        if request.method == "POST":
            old_pwd = request.POST.get("old_password")
            new_pwd = request.POST.get("new_password")
            re_pwd = request.POST.get("re_password")
            if new_pwd == re_pwd:
                obj = request.user.check_password(old_pwd)
                if obj:
                    request.user.set_password(new_pwd)
                    request.user.save()
            return redirect("/login/")
        return render(request,"set_pwd.html")
    set_pwd
    @login_required
    def logout(request):
        auth.logout(request)
        return redirect("/login/")
    logout

    扩展auth_user表

     前提:
            1.在继承之前没有执行过数据库迁移命令
               
            2.继承的类里面不要覆盖AbstractUser里面的字段名
                
            3.需要在配置文件中告诉django你要用UserInfo替代auth_user
                AUTH_USER_MODEL ='应用名.表名'

    两种创建方法:

    from django.db import models
    from django.contrib.auth.models import User,AbstractUser
    
    
    # 第一种:一对一关系  
    # class UserDetail(models.Model):
    #     phone = models.BigIntegerField()
    #     user = models.OneToOneField(to='User')
    
    
    # 第二种:面向对象的继承
    class UserInfo(AbstractUser):
        phone = models.BigIntegerField()
  • 相关阅读:
    poj 2479
    纯CSS实现小圆点和三角形图案
    HDOJ1084 What Is Your Grade?
    4星|《一世富贵》:穿越到宋朝去抢了狄青、范仲淹的风头
    世界不是平的,发达国家在本地生产越来越合算。观点宏大,证据薄弱:3星|《后全球化时代》
    饥饿疗法是目前唯一确信能够延缓衰老的办法:4星|《三联生活周刊》2018年3期
    4星|《重塑》:消费者的信息能力是一个重要的经济变量。新颖的、有见地的国人原创经济理论
    3星|《高情商谈判》:谈判中控制情绪非常重要
    中间商赚差价让世界更美好:3.5星|《中间人经济》
    3.5星|《新零售的未来》:中美两国零售业的现状的分析和未来的展望
  • 原文地址:https://www.cnblogs.com/zhenghuiwen/p/13081636.html
Copyright © 2020-2023  润新知