Django框架之auth模块

目录

一、Auth模块引入

二、创建超级用户(管理员)

三、依赖于auth_user表完成登录注册功能

【1】基础登陆

【2】保存用户状态

【3】登录后跳转

(1)  登录后才能访问页面 -- 局部配置

(2)  登录后才能访问页面 -- 全局配置

(3) 小结

三、修改密码

四、注销

五、注册功能

六、方法总结

【1】校验密码是否正确

【2】保存用户状态

【3】判断当前用户是否登录

【4】获取当前登录的用户

【5】检验用户是否登录装饰器

【6】校验原密码

【7】修改密码

【8】注销登录用户

【9】注册

七、扩展 auth_user 表

【1】方式一

【2】方式二


一、Auth模块引入

  • 我们在创建一个Django项目之后,直接执行数据库迁移命令会自动生成很多表
    • django_session
    • auth_user
  • Django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且必须是管理员用户才能进入

二、创建超级用户(管理员)

python3 manage.py createsuperuser
E:\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:  migrations
Username (leave blank to use 'administrator'):  dream
Email address:  
Warning: Password input may be echoed.
Password:  521
Warning: Password input may be echoed.
Password (again):  521
This 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.y
Superuser 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 render
from 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 authuser_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'''【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 render
from 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 authuser_obj = auth.authenticate(request, username=username, password=password)# 判断当前用户是否存在 --- 存在则有值,不存在则返回Noneif 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, HttpResponse
from 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 authuser_obj = auth.authenticate(request, username=username, password=password)# 判断当前用户是否存在 --- 存在则有值,不存在则返回Noneif 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()) # 匿名用户返回 Falsereturn 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())  # 匿名用户返回 Falsereturn 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_required
def home(request):'''用户登录后才能访问的页面'''print(request.user)# 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法# 未登录访问: AnonymousUser ---- 匿名用户# 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中# 判断用户是否登陆print(request.user.is_authenticated())  # 匿名用户返回 Falsereturn HttpResponse("OK")@login_required
def index(request):return HttpResponse("index")

(3) 小结

  • 局部/全局优先级

    • 局部大于全局
  • 各自的优点

    • 全局的好处在于无需书写重复的代码,但是页面的跳转很单一
    • 局部的好处是在于不同的视图函数再用户没有登陆的情况下可以跳转到不同的页面

三、修改密码

  • 路由
# 修改密码
path('set_password/', views.set_password),
  • 后端 
@login_required
def 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 或者 Falseif 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_required
def 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)  
# dream
print(user_obj.password)  
# pbkdf2_sha256$260000$011PbZAjKIWBfAUJ61Rcyn$vNUYq5L70/ljTLEeJ2dBJtDTEKFDTKzFioFPjZYMdU4=# [2] 用户名和密码不正确的情况下
print(user_obj)  # None ---- 如果数据不符合则返回None

【2】保存用户状态

# 判断当前用户是否存在 --- 存在则有值,不存在则返回None
if user_obj:# 保存用户状态auth.login(request, user_obj)  # 类似于 request.session[key] = user_obj# 只要执行了上面的方法,就可以在任何地方通过 request.user 获取当前用户的登录对象

【3】判断当前用户是否登录

# 判断用户是否登陆
# 匿名用户返回 False  正常用户返回 True
print(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 models
from 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_userAUTH_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

【2】方式二

from django.db import models
from 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/167523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot将多个图片导出成zip压缩包

Springboot将多个图片导出成zip压缩包 将多个图片导出成zip压缩包 /*** 判断时间差是否超过6小时* param startTime 开始时间* param endTime 结束时间* return*/public static boolean isWithin6Hours(String startTime, String endTime) {// 定义日期时间格式DateTimeFormatt…

【数据结构】—搜索二叉树(C++实现,超详细!)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;消えてしまいそうです—真夜中 1:15━━━━━━️&#x1f49f;──────── 4:18 &#x1f504; ◀️ ⏸ ▶️…

函数计算的新征程:使用 Laf 构建 AI 知识库

Laf 已成功上架 Sealos 模板市场&#xff0c;可通过 Laf 应用模板来一键部署&#xff01; 这意味着 Laf 在私有化部署上的扩展性得到了极大的提升。 Sealos 作为一个功能强大的云操作系统&#xff0c;能够秒级创建多种高可用数据库&#xff0c;如 MySQL、PostgreSQL、MongoDB …

js实现获取原生form表单的数据序列化表单以及将数组转化为一个对象obj,将数组中的内容作为对象的key转化为对象,对应的值转换为对象对应的值

1.需求场景 哈喽 大家好啊&#xff0c;今天遇到一个场景&#xff0c; js实现获取原生form表单的数据序列化表单以及将数组转化为一个对象obj&#xff0c;将数组中的内容作为对象的key转化为对象&#xff0c;对应的值转换为对象对应的值 数组对象中某个属性的值&#xff0c;转…

元宇宙现已开放!

在 2023 年 11 月 3 日 The Sandbox 首个全球创作者日上&#xff0c;The Sandbox 联合创始人 Arthur Madrid 和 Sebastien Borget 宣布元宇宙已开放&#xff0c;已创作完整体验的 LAND 持有者可以自行将体验发布至 The Sandbox 地图上。 精选速览 LAND 持有者&#xff1a;如果…

在JVM中 判定哪些对象是垃圾?

目录 垃圾的条件 1、引用计数法 2、可达性分析 3、强引用 4、软引用 5、弱引用 6、虚引用 判断垃圾的条件 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾收集器负责管理内存&#xff0c;其中的垃圾收集算法用于确定哪些对象是垃圾&#xff0c;可以被回收…

VBA即用型代码手册之工作薄的关闭保存及创建

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

[Latex] Riemann 问题中的激波,接触间断,膨胀波的 Tikz 绘图

Latex 代码 \begin{figure}\begin{subfigure}[b]{0.32\textwidth}\centering\resizebox{\linewidth}{!}{\begin{tikzpicture}\coordinate (o) at (0,0);\coordinate (Si) at (2.5,2.5);\coordinate (x) at (1,0);\draw[->] (0,0) -- (3,0) node[right] {$x$};\draw[->] …

ArkTS-自定义组件学习

文章目录 创建自定义组件页面和自定义组件生命周期自定义组件和页面的区别页面生命周期(即被Entry修饰的组件)组件生命周期(即被Component修饰的组件) Builder装饰器&#xff1a;自定义构建函数按引用传递参数按值传递参数 BuilderParam装饰器&#xff1a;引用Builder函数 这个…

Python 将列表拼接为一个字符串,Python join

目录 join方法的源码&#xff1a; 列表数据为字符串 列表数据为数字 三引号也可以使用join join方法的源码&#xff1a; def join(self, abNone, pqNone, rsNone): # real signature unknown; restored from __doc__"""Concatenate any number of strings.T…

harmonyos应用开发者高级认证考试部分答案

1只要使用端云一体化的云端资源就需要支付费用&#xff08;错&#xff09; 2所有使用Component修饰的自定义组件都支持onPageShow&#xff0c;onBackPress和onPageHide生命周期函数。&#xff08;错&#xff09; 3 HarmonyOS应用可以兼容OpenHarmony生态&#xff08;对&#…

一文读懂如何安全地存储密码

目录 引言 明文存储 基本哈希存储 加盐哈希存储 适应性哈希算法 密码加密存储 小结 引言 密码是最常用的身份验证手段&#xff0c;既简单又高效。密码安全是网络安全的基石&#xff0c;对保护个人和组织信息的安全具有根本性的作用。然而有关密码泄漏的安全问题一再发生…

生物动力葡萄酒和有机葡萄酒一样吗?

农业维持了数十万年的文明&#xff0c;但当人类以错误的方式过多干预&#xff0c;过于专注于制造和操纵产品时&#xff0c;农业往往会失败。如果我们的目标是获得最高质量的收成&#xff0c;并长期坚持我们的做法&#xff0c;我们就必须与土地打交道。 当我们开始寻找生物动力…

应用内测分发平台如何上传应用包体?

●您可免费将您的应用&#xff08;支持苹果.ios安卓.apk文件&#xff09;上传至咕噜分发平台&#xff0c;我们将免费为应用生成下载信息&#xff0c;但咕噜分发将会对应用的下载次数进行收费&#xff08;每个账号都享有免费赠送的下载点数以及参加活动的赠送点数&#xff09;&a…

UVA1025 城市里的间谍 A Spy in the Metro

UVA1025 城市里的间谍 A Spy in the Metro 题面翻译 题目大意 某城市地铁是一条直线&#xff0c;有 n n n&#xff08; 2 ≤ n ≤ 50 2\leq n\leq 50 2≤n≤50&#xff09;个车站&#xff0c;从左到右编号 1 … n 1\ldots n 1…n。有 M 1 M_1 M1​ 辆列车从第 1 1 1 站开…

【电路笔记】-分压器

分压器 文章目录 分压器1、概述2、负载分压器3、分压器网络4、无功分压器4.1 电容分压器4.2 感应分压器 5、总结 有时&#xff0c;需要精确的电压值作为参考&#xff0c;或者仅在需要较少功率的电路的特定阶段之前需要。 分压器是解决此问题的一个简单方法&#xff0c;因为它们…

【Vue】filter的用法

上一篇&#xff1a; vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5502 本篇所使用指令 v-for v-on v-html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

在vscode下将ipynb文件转成pdf的方法

正常情况下&#xff0c;可以在vscode的ipynb界面点击上面的三个点&#xff0c;里面有export&#xff0c;可以选择直接输出html和pdf&#xff0c;但是需要latex&#xff0c;由于按扎u安装麻烦&#xff0c;所以我换了一种方法。 ----------------------------------------------…

记一次docker服务启动失败解决过程

环境&#xff1a;centos 7.6 报错&#xff1a;start request repeated too quickly for docker.service 由于服务器修复了内核漏洞&#xff0c;需要重启&#xff0c;没想到重启后&#xff0c;docker启动失败了 查看状态 systemctl status docker如下图 里面有一行提示&…

网络互联与IP地址

目录 网络互联概述网络的定义与分类网络的定义网络的分类 OSI模型和DoD模型网络拓扑结构总线型拓扑结构星型拓扑结构环型拓扑结构 传输介质同轴电缆双绞线光纤 介质访问控制方式CSMA/CD令牌 网络设备网卡集线器交换机路由器总结 IP地址A、B、C类IP地址特殊地址形式 子网与子网掩…