Django框架之auth模块
2724 字
14 分钟
Django框架之auth模块
- 1纯手撸Web框架
- 2Python框架初识
- 3Django框架初识
- 4Django框架安装
- 5Django框架入门之小白必会三板斧
- 6Django便捷函数shortcuts
- 7Django框架入门之静态文件
- 8Django的静态文件
- 9Django框架入门之request对象
- 10Django框架入门之ORM操作
- 11Django框架之生命周期流程图
- 12Django框架之路由层
- 13Django框架之视图层
- 14Django框架之模板层
- 15Django框架之模型层
- 16图书管理系统
- 17Ajax基础操作
- 18Ajax进阶操作
- 19JS确认插件补充
- 20Django框架之序列化组件serializers
- 21Django框架之批量插入数据
- 22Django框架补充之分页器推导
- 23Django框架之Form组件
- 24Django框架Form组件之常用字段及插件
- 25Django框架Form组件之渲染HTML代码
- 26Django框架Form组件之渲染错误信息
- 27Django框架Form组件之钩子函数(Hook)
- 28Django框架Form组件之源码
- 29Django框架Form组件之模型表单ModelForm
- 30Django表单API详解
- 31Django框架之Cookie和Session
- 32Django框架之会话session补充
- 33Django框架之CBV添加装饰器的三种方式
- 34Django框架之中间件引入
- 35Django框架之中间件思想
- 36Django框架之csrf跨站请求
- 37Django框架之auth模块本文
- 38Django框架之settings源码
- 39Django框架之settings配置
- 40Django框架之settings核心配置项
- 41RBAC权限系统
- 42前端基础之URL编码
【一】Auth模块引入
- 我们在创建一个Django项目之后,直接执行数据库迁移命令会自动生成很多表
- django_session
- auth_user
- Django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且必须是管理员用户才能进入
【二】创建超级用户(管理员)
python3 manage.py createsuperuserE:\Python39\python.exe "E:\Pycharm\PyCharm 2023.1.3\plugins\python\helpers\pycharm\django_manage.py" createsuperuser "E:/Old Boy/django_project/day14"Tracking file by folder pattern: migrationsUsername (leave blank to use 'administrator'): dreamEmail address:Warning: Password input may be echoed.Password: 521Warning: Password input may be echoed.Password (again): 521This password is too short. It must contain at least 8 characters.Bypass password validation and create user anyway? [y/N]: This password is entirely numeric. ySuperuser created successfully.
Process finished with exit code 0【三】依赖于auth_user表完成登录注册功能
【1】基础登陆
- 路由
path('login/', views.login),- 前端
<form action="" method="post"> {# 取消crsf校验 #} {% csrf_token %} <p>username:<input type="text" name="username"></p> <p>password:<input type="text" name="password"></p> <input type="submit" class="btn btn-success"></form>- 后端
from django.shortcuts import renderfrom django.contrib import auth
# Create your views here.def login(request): if request.method == 'POST': # (1) 取到前端输入的用户名和密码 username = request.POST.get('username') password = request.POST.get('password') # (2) 进行用户名和密码的校验 # 从用户表中获取数据 # --- 1、表如何获取 # --- 2、表中的密码是密文,如何比对 # 导入 auth 校验模块 : from django.contrib import auth user_obj = auth.authenticate(request, username=username, password=password) # [1] 用户名和密码正确的情况下 print(user_obj) # dream ---- 这是用户对象内部封装的一个方法 __str__ 方法 print(user_obj.username) # dream print(user_obj.password) # pbkdf2_sha256$260000$011PbZAjKIWBfAUJ61Rcyn$vNUYq5L70/ljTLEeJ2dBJtDTEKFDTKzFioFPjZYMdU4= # [2] 用户名和密码不正确的情况下 print(user_obj) # None ---- 如果数据不符合则返回None
''' 【1】自动查找 auth_user 表 【2】自动给密码加密进行比对 注意事项: 参数必须传入用户名和密码 不能只传入一个用户名(一步就帮助我们筛选出用户数据) '''
return render(request, 'login.html')【2】保存用户状态
- 如果使用auth模块,就使用其中所有封装好的方法
- 如果不想使用,就单独封装方法,不要调用其中的方法
- auth.login(request, user_obj)
- 类似于 request.session[key] = user_obj
- 只要执行了上面的方法,就可以在任何地方通过 request.user 获取当前用户的登录对象
from django.shortcuts import renderfrom django.contrib import auth
# Create your views here.def login(request): if request.method == 'POST': # (1) 取到前端输入的用户名和密码 username = request.POST.get('username') password = request.POST.get('password') # (2) 进行用户名和密码的校验 # 从用户表中获取数据 # --- 1、表如何获取 # --- 2、表中的密码是密文,如何比对 # 导入 auth 校验模块 : from django.contrib import auth user_obj = auth.authenticate(request, username=username, password=password)
# 判断当前用户是否存在 --- 存在则有值,不存在则返回None if user_obj: # 保存用户状态 auth.login(request, user_obj) # 类似于 request.session[key] = user_obj # 只要执行了上面的方法,就可以在任何地方通过 request.user 获取当前用户的登录对象
''' 【1】自动查找 auth_user 表 【2】自动给密码加密进行比对 注意事项: 参数必须传入用户名和密码 不能只传入一个用户名(一步就帮助我们筛选出用户数据) '''
return render(request, 'login.html')【3】登录后跳转
from django.shortcuts import render, redirect, HttpResponsefrom django.contrib import auth
# Create your views here.def login(request): if request.method == 'POST': # (1) 取到前端输入的用户名和密码 username = request.POST.get('username') password = request.POST.get('password') # (2) 进行用户名和密码的校验 # 从用户表中获取数据 # --- 1、表如何获取 # --- 2、表中的密码是密文,如何比对 # 导入 auth 校验模块 : from django.contrib import auth user_obj = auth.authenticate(request, username=username, password=password)
# 判断当前用户是否存在 --- 存在则有值,不存在则返回None if user_obj: # 保存用户状态 auth.login(request, user_obj) # 类似于 request.session[key] = user_obj # 只要执行了上面的方法,就可以在任何地方通过 request.user 获取当前用户的登录对象 # 登陆成功后跳转页面 return redirect('/home/')
''' 【1】自动查找 auth_user 表 【2】自动给密码加密进行比对 注意事项: 参数必须传入用户名和密码 不能只传入一个用户名(一步就帮助我们筛选出用户数据) '''
return render(request, 'login.html')
def home(request): print(request.user) # dream ---- 这是用户对象内部封装的一个方法 __str__ 方法 print(request.user) # 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法 # 未登录访问: AnonymousUser ---- 匿名用户 # 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中 return HttpResponse("OK")- 判断用户是否登录
def home(request): print(request.user) # 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法 # 未登录访问: AnonymousUser ---- 匿名用户 # 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中 # 判断用户是否登陆 print(request.user.is_authenticated()) # 匿名用户返回 False
return HttpResponse("OK")(1)登录后才能访问页面 — 局部配置
from django.contrib.auth.decorators import login_required
# 添加装饰器 --- 指定未登录的跳转页面@login_required(login_url='/login/') # 局部配置def home(request): '''用户登录后才能访问的页面''' print(request.user) # 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法 # 未登录访问: AnonymousUser ---- 匿名用户 # 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中 # 判断用户是否登陆 print(request.user.is_authenticated()) # 匿名用户返回 False
return HttpResponse("OK")http://127.0.0.1:8000/accounts/login/?next=/home/(2)登录后才能访问页面 — 全局配置
- 在 settings 文件中添加
LOGIN_URL = '/login/'from django.contrib.auth.decorators import login_required
# 添加装饰器 --- 指定未登录的跳转页面@login_requireddef home(request): '''用户登录后才能访问的页面''' print(request.user) # 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法 # 未登录访问: AnonymousUser ---- 匿名用户 # 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中 # 判断用户是否登陆 print(request.user.is_authenticated()) # 匿名用户返回 False
return HttpResponse("OK")
@login_requireddef index(request): return HttpResponse("index")(3)小结
- 局部/全局优先级
- 局部大于全局
- 各自的优点
- 全局的好处在于无需书写重复的代码,但是页面的跳转很单一
- 局部的好处是在于不同的视图函数再用户没有登陆的情况下可以跳转到不同的页面
【三】修改密码
- 路由
# 修改密码path('set_password/', views.set_password),- 后端
@login_requireddef set_password(request): if request.method == 'POST': old_password = request.POST.get('old_password') new_password = request.POST.get('new_password') confirm_password = request.POST.get('confirm_password') # 先校验两次密是否一致 if new_password == confirm_password: # 校验旧密码是否相同 is_right = request.user.check_password(old_password) # 内部自己加密密码进行比对 # 返回的结果为 True 或者 False if is_right: # 修改密码 request.user.set_password(confirm_password) # 仅仅在修改对象的属性 # 修改完密码后进行保存数据 request.user.save()
return redirect('/login/')
return render(request, 'set_password.html', locals())- 前端
<form action="" method="post"> {# 取消crsf校验 #} {% csrf_token %} <p>username:<input type="text" name="username" disabled value="{{ request.user.username }}"></p> <p>old_password:<input type="text" name="old_password"></p> <p>new_password:<input type="text" name="new_password"></p> <p>confirm_password:<input type="text" name="confirm_password"></p> <input type="submit" class="btn btn-success"></form>【四】注销
- 路由
# 注销用户path('login_out/', views.login_out),- 后端
@login_requireddef login_out(request): auth.logout(request) # 清空当前登录用户的数据 ----- request.session.flush() return redirect('/login/')【五】注册功能
- 路由
# 注册用户path('register/', views.register),- 后端
def register(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') confirm_password = request.POST.get('confirm_password') # 操作auth_user表写入数据 # User.objects.create(username=username, password=confirm_password) # 会写入数据,但是保存的密码是明文的,没有加密 # 创建普通用户 User.objects.create_user(username=username, password=confirm_password) # 创建超级用户 - 了解 --- 使用代码创建超级用户,邮箱和密码是必填的,而用命令创建可以忽略邮箱 # User.objects.create_superuser(username=username, password=password,email=email) return render(request, 'register.html')【六】方法总结
【1】校验密码是否正确
from django.contrib import auth# (1) 取到前端输入的用户名和密码username = request.POST.get('username')password = request.POST.get('password')# (2) 进行用户名和密码的校验 ---- 参数必须传用户名和密码user_obj = auth.authenticate(request, username=username, password=password)
# [1] 用户名和密码正确的情况下print(user_obj)# dream ---- 这是用户对象内部封装的一个方法 __str__ 方法print(user_obj.username)# dreamprint(user_obj.password)# pbkdf2_sha256$260000$011PbZAjKIWBfAUJ61Rcyn$vNUYq5L70/ljTLEeJ2dBJtDTEKFDTKzFioFPjZYMdU4=
# [2] 用户名和密码不正确的情况下print(user_obj) # None ---- 如果数据不符合则返回None【2】保存用户状态
# 判断当前用户是否存在 --- 存在则有值,不存在则返回Noneif user_obj: # 保存用户状态 auth.login(request, user_obj) # 类似于 request.session[key] = user_obj # 只要执行了上面的方法,就可以在任何地方通过 request.user 获取当前用户的登录对象【3】判断当前用户是否登录
# 判断用户是否登陆# 匿名用户返回 False 正常用户返回 Trueprint(request.user.is_authenticated())【4】获取当前登录的用户
print(request.user)# 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法# 未登录访问: AnonymousUser ---- 匿名用户# 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中【5】检验用户是否登录装饰器
from django.contrib.auth.decorators import login_required- (1)局部配置
- (2)全局配置
- (3)全局/局部的优缺点
【6】校验原密码
# 校验旧密码是否相同is_right = request.user.check_password(old_password) # 内部自己加密密码进行比对# 返回的结果为 True 或者 False【7】修改密码
# 修改密码request.user.set_password(confirm_password) # 仅仅在修改对象的属性# 修改完密码后进行保存数据request.user.save()【8】注销登录用户
auth.logout(request)# 清空当前登录用户的数据 ----- request.session.flush()【9】注册
# 操作auth_user表写入数据# 会写入数据,但是保存的密码是明文的,没有加密User.objects.create(username=username, password=confirm_password)# 创建普通用户User.objects.create_user(username=username, password=confirm_password)# 创建超级用户 - 了解 --- 使用代码创建超级用户,邮箱和密码是必填的,而用命令创建可以忽略邮箱User.objects.create_superuser(username=username, password=password,email=email)【七】扩展 auth_user 表
【1】方式一
from django.db import modelsfrom django.contrib.auth.models import User, AbstractUser
# Create your models here.# 扩展 auth_user 表# 第一种方式 : 一对一关系(不推荐)class UserDetail(models.Model): phone = models.CharField(max_length=32) user = models.OneToOneField(to='User', on_delete=models.CASCADE)【2】方式二
from django.db import modelsfrom django.contrib.auth.models import User, AbstractUser
# 第二种方式 : 面向对象的继承class UserInfo(AbstractUser): ''' 如果继承了AbstractUser 那么在执行数据库迁移命令的时候,auth_user表就不会被创建 而 UserInfo 会在 auth_user表 的基础上添加自定义扩展的字段
优点: 直接通过自己定义的表快速完成操作及扩展
前提 (1)在执行之前没有执行过数据库迁移命令 auth_user 表没有被创建 如果当前库已经被创建,则需要更换新的库 (2)继承的表里面不要覆盖 AbstractUser 里面的字段名 表里面有的字段不要动,只扩展额外的字段即可 (3)需要再配置文件中声明Django要使用 UserInfo 替代 auth_user AUTH_USER_MODEL = 'app01.UserInfo' ---'应用名.表名' ''' phone = models.CharField(max_length=32)- 需要再配置文件中声明 Django 要使用 UserInfo 替代 auth_user
AUTH_USER_MODEL = 'app01.UserInfo' ---'应用名.表名'- 如果自己写表代替了 auth_user
- auth模块功能正常使用,参考的表也由 auth_user 变成了 UserInfo
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
C 语言发展史
编程语言了解 C 语言从 BCPL、B 语言到现代标准 C 的发展历程、核心特点与应用领域。
2
C 语言开发环境的安装与配置
编程语言在 Windows、Linux 与 macOS 上安装 C 工具链,配置编辑器,并编译运行第一个 C 程序。
3
C 语言初识:程序运行机制与基本结构
编程语言认识 C 程序从源代码到运行的完整流程,以及基础语法和程序的基本结构。
4
C 语言基础:注释、关键字、变量与数据类型
编程语言学习 C 语言的注释、关键字、标识符、常量、变量和基本数据类型等基础知识。
5
C 语言数据类型
编程语言理解 C 语言的数据类型体系,包括基本类型、整数类型、浮点类型和逻辑类型。
随机文章随机推荐














