Django之Auth模块

Auth模块引入

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

【1】创建超级用户(管理员)

在终端输入一下指令

python36 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

【2】利用auth_user表完成登录注册功能

【2.0】基础登录

【2.0.1】配置路由

path('login/', views.login),

【2.0.2】前端代码

<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>

【2.0.3】后端代码

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.1】保存用户状态

  • 如果使用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')

【2.2】登录后跳转

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")

【2.2.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")

【2.2.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")

【2.3】小结

  • 局部/全局优先级
    • 局部大于全局
  • 各自的优点
    • 全局的优点
      • 无需书写重复的代码,但是页面的跳转很单一
    • 局部的优点
      • 在于不同的视图函数再用户没有登录的情况下可以跳转到不同的页面

【3】修改密码

        【3.1】路由文件的配置

# 修改密码
path('set_password/', views.set_password),

        【3.2】后端代码

@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())

        【3.3】前端代码

<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>

【4】注销

        【4.1】路由配置

# 注销用户
path('login_out/', views.login_out),

        【4.2】后端代码

@login_required
def login_out(request):auth.logout(request)  # 清空当前登录用户的数据 ----- request.session.flush()return redirect('/login/')

【5】注册功能

        【5.1】路由配置

# 注册用户
path('register/', views.register),

        【5.2】后盾

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')

【6】总结

        【6.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

        【6.2】保存用户状态

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

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

# 判断用户是否登陆
# 匿名用户返回 False  正常用户返回 True
print(request.user.is_authenticated)  

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

print(request.user)
# 登陆成功: dream ---- 这是用户对象内部封装的一个方法 __str__ 方法
# 未登录访问: AnonymousUser ---- 匿名用户
# 本质上是自动去django_session里面查找到当前用户对象,然后封装到 request.user 中

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

from django.contrib.auth.decorators import login_required
  • 1、局部配置
  • 2、全局配置
  • 3、全局/局部的优缺点

        【6.6】校验原密码

# 校验旧密码是否相同
is_right = request.user.check_password(old_password)  # 内部自己加密密码进行比对
# 返回的结果为  True 或者 False

        【6.7】修改密码

# 修改密码
request.user.set_password(confirm_password)  # 仅仅在修改对象的属性
# 修改完密码后进行保存数据
request.user.save()

        【6.8】注销登录用户

auth.logout(request)  
# 清空当前登录用户的数据 ----- request.session.flush()

        【6.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)

【7】扩展auth_user表

        【7.1】方式一

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)

        【7.2】方式二

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

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

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

相关文章

quickapp_快应用_某些css样式不兼容问题

样式问题 引入css样式文件[1] 单位px [2]选择器[3]盒模型[4]样式布局-默认弹性布局且不可取消[5-1]样式切换-类名的动态切换-语法[5-2]样式切换 - 类名的动态切换-目标元素[5-3] 样式切换 - 行内样式动态切换[6]background[7]overflow[8]border-radius[9]盒子阴影[10] 定位erro…

【调度算法】开放车间调度问题遗传算法(failed)

省流&#xff1a;这是一个错误的代码备份&#xff0c;如果你需要可以直接运行的完整代码&#xff0c;请移步GitHub。 本以为手搓了一个单机调度和并行机调度的遗传算法&#xff0c;就可以尝试写开放车间的遗传算法了&#xff0c;结果手搓了两天&#xff0c;开始作业时间和结束…

1、Mysql架构与历史

Mysql逻辑架构 最上层是服务并不是Mysql所独有的&#xff0c;大多数基于网络的客户端/服务器的工具或者服务都有类似的架构&#xff0c;比如连接处理&#xff0c;授权认证&#xff0c;安全等。 第二层是Mysql比较有意思的部分。大多数Mysql的核心服务都在这一层&#xff0c;…

torch.view()和.reshape()

view只能作用在连续的张量上&#xff08;张量中元素的内存地址是连续的&#xff09;。而reshape连续or非连续都可以。 调用x.reshape的时候&#xff0c;如果x在内存中是连续的&#xff0c;那么x.reshape会返回一个view&#xff08;原地修改&#xff0c;此时内存地址不变…

用户与组管理:如何在服务器系统中管理用户和权限

你是否想过&#xff0c;当你登录到一个服务器系统时&#xff0c;你是如何被识别和授权的&#xff1f;你是否知道&#xff0c;你可以通过创建和管理用户和组来简化和优化你的系统管理工作&#xff1f;你是否想了解一些常用的用户和组管理命令和技巧&#xff1f;如果你的答案是肯…

c语言实现简单的string

文章目录 前言一、注意事项二、代码valgrind扫描总结 前言 在c语言中利用面向对象的编程方式&#xff0c;实现类似c中的string类。 一、注意事项 所有与string结构体相关的函数全都没有返回值。 在c中&#xff0c;当产生临时对象时编译器会自动的加入析构函数&#xff0c;销毁…

Walrus 入门教程:如何创建模板以沉淀可复用的团队最佳实践

模板是 Walrus 的核心功能之一&#xff0c;模板创建完成后用户可以重复使用&#xff0c;并在使用过程中逐渐沉淀研发和运维团队的最佳实践&#xff0c;进一步简化服务及资源的部署。用户可以使用 HCL 语言自定义创建模板&#xff0c;也可以一键复用 Terraform 社区中上万个成熟…

云原生安全工具汇总(docker、k8s、Kubernetes、Git仓库)

目录 Metarget:云原生靶机环境 CDK:容器环境定制的渗透测试工具 container-escape-check:容器逃逸检测

synchronized在代码中的用法

synchronized可以对两种对象加锁&#xff1a;实例对象和类对象。下边先说对类对象加锁的代码&#xff1a; 第1是修饰static方法&#xff0c;第2种是直接锁类的class对象&#xff1b; /*** title: SynchronizedStaticDemo1* description: synchronized 对类加锁1* author: * d…

【Python百宝箱】Python数据探险:Excel与数据科学的完美结合

前言 在当今信息爆炸的时代&#xff0c;数据处理和分析已经成为各行各业不可或缺的一部分。在众多数据处理工具中&#xff0c;Python以其简洁而强大的语法成为数据科学家和分析师的首选之一。本文将深入探讨与电子表格处理相关的Python库&#xff0c;介绍它们的功能、应用场景…

批量按顺序1、2、3...重命名所有文件夹里的文件

最新&#xff1a; 最快方法&#xff1a;先用这个教程http://文件重命名1,2......nhttps://jingyan.baidu.com/article/495ba841281b7079b20ede2c.html再用这个教程去空格&#xff1a;利用批处理去掉文件名中的空格-百度经验 (baidu.com) 以下为原回答 注意文件名有空格会失败…

LeetCode Hot100 105.从前序与中序遍历序列构造二叉树

题目&#xff1a;给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 代码&#xff1a; class Solution {private Map<Integer, Integer> indexM…

ESP32网络开发实例-远程Web串口监视器

远程Web串口监视器 文章目录 远程Web串口监视器1、应用介绍2、软件准备3、硬件准备4、代码实现在本文中,我们将构建一个 ESP32 网络服务器,用作远程串行监视器。 基于 Web 的串行监视器的工作方式与通常用于调试目的的 Arduino IDE 串行监视器的工作方式相同。 1、应用介绍 …

数字逻辑电路基础-时序逻辑电路之移位寄存器

文章目录 一、移位寄存器定义二、verilog源码三、仿真结果一、移位寄存器定义 移位寄存器定义 A shift register is a type of digital circuit using a cascade of flip flops where the output of one flip-flop is connected to the input of the next. 移位寄存器是一种将…

docker部署MySQL5.7设置密码和远程访问的方法

运行MySQL docker run -p 3306:3306 --name mysql57 -v /root/mysql/log:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORDD7txumqc2b! -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8…

c++八股文记录

八股文 1.类和结构体的区别 在 C 中&#xff0c;类&#xff08;class&#xff09;和结构体&#xff08;struct&#xff09;在语法上几乎是相同的&#xff0c;唯一的区别是默认的访问权限。在结构体中&#xff0c;默认的访问权限是公有的&#xff08;public&#xff09;&#x…

基于51单片机超市快递寄存自动柜设计源程序

一、系统方案 1、本设计采用这51单片机作为主控器。 2、存包&#xff0c;GSM短信取件码。 3、液晶1620显示。 4、矩阵键盘输入取件码&#xff0c;完成取包。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /******************************…

python基于flask_sockets实现WebSocket

WebSocket是啥&#xff1f; WebSocket是HTML5引入的新的通信协议&#xff0c;主要由Web客户端和服务器实现&#xff0c;当然它也可以在Web之外实现。 与HTTP连接不同&#xff0c;WebSocket连接是客户端和服务器之间永久的双向通信通道&#xff0c;其中任何一个都可以启动交换。…

量子计算的发展

目录 一、量子力学的发展历程二、量子计算的发展历程三、量子计算机的发展历程四、量子信息科学的发展 一、量子力学的发展历程 量子力学是现代物理学的一个基本分支&#xff0c;它的发展始于20世纪初。以下是量子力学发展的几个重要阶段&#xff1a; 普朗克&#xff08;1900&…

steam搬砖还能做吗?CSGO饰品未来走势如何?

steam/csgo搬砖项目真能月入过万吗&#xff1f;到底真的假的&#xff1f; 如何看待CSGO饰品市场的整体走向&#xff1f; 从整体来说&#xff0c;CSGO的饰品市场与规模肯定会持续不断的上升&#xff0c;大盘不会发生特别大的波动&#xff0c;目前处于稳定期&#xff01;&#x…