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模块的主要内容,如果未能解决你的问题,请参考以下文章