zoukankan      html  css  js  c++  java
  • Django中的auth模块

    1,创建超级用户

    • 在命令行输入:python manage.py createsuperuser

     2,认证校验用户名和密码(authenticate方法)

    先得导入auth模块:from django.contrib import auth

      语法:obj = auth.authenticate(request, username, password)

    认证成功返回一个对象,认证失败是 None

    authenticate提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username,passeord两个关键字参数,如果认证成功(用户名正确有效),变回返回一个User对象.

    authenticate()会在给User()对象上设置一个属性来标识后端已经认证了该系统,且该信息在后续登录过程中是需要的(看图说话)

    相关代码:

    from django.shortcuts import render, HttpResponse, redirect
    from django.contrib import auth
    from about_auth.froms import RegForm
    
    
    
    def login(request):
        # 如果请求进来是提交数据
        if request.method == "POST":
            # 获取用户输入的值
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            # 1,验证用户名及密码是否正确需要用username,password关键字
            obj = auth.authenticate(username=user,password=pwd)
            # 当认证成功的时候返回一个User对象,认证不成功返回一个None
            print(obj,type(obj))
            # 2,判断obj的属性
            # 2.1,如果obj这个对象是User保存session数据,无返回值
            if obj:
                data = auth.login(request, obj)
                print(data)
                # 获取到用户输入的地址
                next = request.GET.get("next")
                # 判断用户输入的地址,如果是login,此时next就是None,否则就不是
                if next:
                    redirect(next)
                else:
                    redirect("/login")
            
        # 第一次进来是get请求,返回给用户一个登录页面
        return render(request, "login.html")

    3,保存登录状态,记录到session(login(request, user))

      该函数接收一个HttpRequest对象,以及一个经过认证的User对象,该函数实现一个用户登录的功能,它本质上会在后端为该用户生成相关session数据

    相关代码:

    from django.shortcuts import render, HttpResponse, redirect
    from django.contrib import auth
    from about_auth.froms import RegForm
    
    
    
    def login(request):
        # 如果请求进来是提交数据
        if request.method == "POST":
            # 获取用户输入的值
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
            # 1,验证用户名及密码是否正确需要用username,password关键字
            obj = auth.authenticate(username=user,password=pwd)
            # 当认证成功的时候返回一个User对象,认证不成功返回一个None
            print(obj,type(obj))
            # 2,判断obj的属性
            # 2.1,如果obj这个对象是User保存session数据,无返回值
            if obj:
                data = auth.login(request, obj)
                print(data)
                # 获取到用户输入的地址
                next = request.GET.get("next")
                # 判断用户输入的地址,如果是login,此时next就是None,否则就不是
                if next:
                    redirect(next)
                else:
                    redirect("/login")
            
        # 第一次进来是get请求,返回给用户一个登录页面
        return render(request, "login.html")

    4,注销(logout(request))

    该函数接受一个HttpResponse对象,无返回值,当调用该函数时,当前请求的session信息会全部清除,该用户即使没有登录,使用该函数也不会报错:

    相关代码:

    def logout(request):
        # 把session的数据删除掉
        auth.logout(request)
        return redirect("/login/")

    5,判断登录状态:用来判断当前请求是否通过了认证(is_authenticated())

    def index(request):
        # 判断登录状态,返回一个布尔值,如果成功返回一个True,for则False
        print(request.user.is_authenticated())
    
        return render(request, "index.html")

    6,创建用户 :

    • 表名.objects.create(),        创建普通用户,密码是明文的
    • 表名.obiects.create_表名,       创建普通用户,密码是密文的
    • 表名.objects.create_super表名  创建超级用户,密码是密文的

    代码如下:

    from django.shortcuts import render, HttpResponse, redirect
    from django.contrib import auth
    from about_auth.froms import RegForm
    from django.contrib.auth.models import User
    from about_auth.froms import RegForm
    
    def register(request):
        form_obj = RegForm()
        # 第二次进来是POST请求提交数据
        if request.method == "POST":
            # 实例化一个RegForm的对象,去校验提交的数据是否合法
            form_obj = RegForm(request.POST)
            # 如果通过了校验
            if form_obj.is_valid():
                # 获取有效的数据,是一个字典
                data_dict = form_obj.cleaned_data
                # 把再次输入的密码删除掉,然后存储到数据库中
                data_dict.pop("re_password")
                # 把数据更新到数据库中
                # 1,注册超级用户 ,密码是密文的
                # User.objects.create_superuser(email="", **data_dict)
                # 2,注册普通用户,密码是密文的
                # User.objects.create_user(**data_dict)
                # 3,注册普通用户,密码是明文的
                User.objects.create(**data_dict)
                return HttpResponse("注册成功")
    
        return render(request, "register.html", {"form_obj": form_obj})

    7,和密码相关

      验证旧密码:request.表名.check_password("root1234")

      设置密码:request.表名.set_password("admin1234")

      request.表名.save()

    代码演示:

    def index(request):
        # 判断登录状态,返回一个布尔值,如果成功返回一个True,for则False
        print(request.user.is_authenticated())
        # 修改密码,先获取用户输入的旧密码和数据库中存放的原密码是否一致,
        # 一致的情况下,把用户新输入的密码存放到数据库中
    
        # 把数据库中放入密码拿出来和用户数日的密码做校验,如果一致
        if request.user.check_password("root1234"):
            # 就把用户再次输入的密码更新到数据库中
            request.user.set_password("admin1234")
            # 记得save()把对数据库在ORM的操作,变成数据库操作
            request.user.save()
        return render(request, "index.html")

    8,扩展默认的auth_user表

    我们可以通过继承内置的AbstracUser类,来定义一个自己的Model类,

    from django.contrib.auth.models import AbstractUser
    class UserInfo(AbstractUser):
        """
        用户信息表
        """
        nid = models.AutoField(primary_key=True)
        phone = models.CharField(max_length=11, null=True, unique=True)
        
        def __str__(self):
            return self.username

    注意:有时拓展表以后,需要在settings中加

    # 引用Django自带的User表,继承使用时需要设置
    AUTH_USER_MODEL = "app名.UserInfo"

    定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。(表名发生了变化)

  • 相关阅读:
    Windows中的库编程(三、函数调用约定 Calling Convention)
    weui
    js 压缩图片
    django 跨域访问
    html5
    有用的网站
    Chrome
    srpingBoot配置多环境配置文件
    Mysql在查询时不区分大小写
    [CentOS7]Nginx 1.20.1不支持四层负载
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/9899990.html
Copyright © 2011-2022 走看看