Django中的auth模块

Posted ljc-0923

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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表来做用户认证。(表名发生了变化)

 

以上是关于Django中的auth模块的主要内容,如果未能解决你的问题,请参考以下文章

Django中的auth模块

Django中的auth模块

扩展Django内置的auth模块代码示例

Django Auth认证模块

Django框架——Auth模块

django ---Auth模块