auth模块

一. auth模块前戏

# 引入:其实我们在创建好一个django项目之后直接执行数据库迁移命令会自动生成很多表 例如:django_sessionauth_user我们知道django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且还必须是管理员用户才能进入,现在我们就可以通过在命令行中执行创建超级用户(管理员)的命令, 来创建你的admin用户python3 manage.py createsuperuser# auth模块作用:主要就是依赖于auth_user表完成用户相关的所有功能.

二. auth模块方法及使用

主要分为登录认证, 保存用户状态, 判断当前用户是否登陆, 获取当前登陆用户, 登录认证装饰器, 密码核对, 修改密码, 注销当前登录用户, 注册

1. 登录认证

# 登录认证: 比对用户名和密码是否正确
'''
效验成功返回用户对象. 效验失败返回None.
注意: request可以不指定默认就是None,  而括号内必须同时传入用户名和密码. 不能只指定一个.
'''
from django.contrib import auth
user_obj = auth.authenticated(request, username=username, password=password)
print(user_obj)           # jason  提示: 返回用户对象, 只是内部书写了__str__烦伐. 如果数据不符合则返回None
print(user_obj.username)  # jason
print(user_obj.password)  # pbkdf2_sha256$36000$zeNDf8CkZj7y$b+e/CjzZoAnbBIpvUWgz25ybBDqDzRTmYAHPytxqRYQ=

2. 保存用户状态

# 保存用户状态:
'''
1. 内部自动查找auth_user标签
2. 内部自动给密码加密再比对
提示: 只要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象
'''
auth.login(request, user_obj)   # 内部调用的就是 request.session['key']=user_obj

3. 判断当前用户是否登陆

# 判断当前用户是否登陆:
request.user.is_authenticated()

4. 获取当前登陆用户

# 获取当前登陆用户:
'''
1. 获取浏览器提交过来的sessionid对应的随机字符串
2. 后端拿到随机字符串到django_session表中获取数据2-1. 如果浏览器提交的随机字符串没有匹配上. 返回 AnonymousUser 匿名用户2-2. 如果浏览器提交的随机字符串有匹配上了. 返回对应的用户对象
'''
request.user  # 匹配上返回对应用户对象. 没有匹配上返回 AnonymousUser 对象

5. 登录认证装饰器

# 登录认证装饰器:
from django.contrib.auth.decorators import login_required
# 局部设置@login_required(login_url='/login/')   # login_url 控制跳到指定的页面.  否则会以accounts打头, 跟随你的登录页面路径/login/?next=/my_home/
# 全局设置到settings.py中书写: LOGIN_URL = '/login/'@login_required    # 之后的装饰器使用就不需要传login_url参数了
# 优先级: 局部 > 全局
# 局部优缺点:缺点: 如果争对需要装饰的对象都是在没有登录以后跳转到同一个页面代码就会显得冗余 .优点: 不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面
# 全局优缺点:缺点: 跳转的页面却很单一优点: 全局的好处在于无需重复写代码

6. 密码核对

# 密码核对: 比对原密码
'''
会将old_password加密与原密码比对. 返回布尔值.
'''
is_correct = request.user.check_password(old_password)

7. 修改密码

# 修改密码:
'''
第一步仅仅是在修改对象的属性
第二步才是真正的操作数据进行保存
'''
request.user.set_password(new_password)
request.user.save()

8. 注销当前登录用户

# 注销当前登录用户:
auth.logout(request)  # 内部使用的就是 request.session.flush()

9. 注册

# 注册:
from django.contrib.auth.models import User
# 操作auth_user表写入数据
# 方式一: 密码无加密. 不推荐使用
User.object.create(username=username, password=password)# 方式二: 创建普通用户. 密码会进行加密
User.object.create_user(username=username, password=password)# 方式三: 超级用户创建(了解). 密码会进行加密. 代码创建的email必填. 命令行创建的可以不填
User.object.create_superuser(username=username, password=password, email='111@qq.com')

10. 代码示例

from django.contrib import authdef my_login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')# 1. 登录认证: 比对用户名和密码是否正确'''user_obj = auth.authenticate(request, username=username, password=password)效验成功返回用户对象. 效验失败返回None.注意: request可以不指定默认就是None,  而括号内必须同时传入用户名和密码. 不能只指定一个.'''user_obj = auth.authenticate(request, username=username, password=password)print(user_obj, type(user_obj))  # None/egon  <class 'django.contrib.auth.models.User'>if user_obj:print('user_obj.username:', user_obj.username)  # egonprint('user_obj.password:',user_obj.password)  # pbkdf2_sha256$36000$PAy4tWE1NiBa$0vgeQMKwDK0U+F3KqiiiT+eEWmA9kD0Iq+mUON1jPLo=# 2. 保存用户状态:'''1. 内部自动查找auth_user标签2. 内部自动给密码加密再比对提示: 只要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象'''auth.login(request, user_obj)  # 内部调用的就是 request.session['key']=user_objtarget_url = request.GET.get('next')print('target_url:', target_url)  # target_url: None / target_url: /my_index/if target_url:obj = redirect(target_url)else:obj = redirect('/my_home/')return objreturn render(request, 'my_login.html')from django.contrib.auth.decorators import login_required# 4. 登录认证装饰器 优先级: 局部 > 全局
@login_required  # 全局
def my_home(request):# 3. 获取当前登陆用户:'''request.user  # 匹配上返回对应用户对象. 没有匹配上返回 AnonymousUser 对象1. 获取浏览器提交过来的sessionid对应的随机字符串2. 后端拿到随机字符串到django_session表中获取数据2-1. 如果浏览器提交的随机字符串没有匹配上. 返回 AnonymousUser 匿名用户2-2. 如果浏览器提交的随机字符串有匹配上了. 返回对应的用户对象'''print('request.user:', request.user)print('request.user.is_authenticated():', request.user.is_authenticated())return HttpResponse('这是 my_home 页面只有登录了的用户才能进来哦~')@login_required(login_url='/my_login/')  # 局部
def my_index(request):return HttpResponse('这是 my_index 页面只有登录了的用户才能进来哦~')from django.contrib.auth.models import User@login_required
def my_set_password(request):retain_dict = {  # 保留form表单提交后之前的数据. 这里先占位, 再赋值.'old_password': '','new_password': '','confirm_password': '',}error_dict = {  # 展示form表单输入错误的内容. 这里先占位, 再赋值.'old_password': '','new_password': '','confirm_password': '',}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')retain_dict['old_password'] = old_passwordretain_dict['new_password'] = new_passwordretain_dict['confirm_password'] = confirm_passwordif confirm_password == new_password:# 5. 密码核对: 比对原密码  会将old_password加密与原密码比对. 返回布尔值.is_correct = request.user.check_password(old_password)print('is_correct:', is_correct)  # is_correct: Trueif is_correct:# 6. 修改密码:request.user.set_password(new_password)  # 仅仅是在修改对象的属性request.user.save()  # 这一步才是真正的操作数据库retain_dict.clear()return redirect('/my_login/')else:error_dict['old_password'] = '原密码不正确, 请核对后在输!'else:error_dict['new_password'] = '两次密码输入不一致!'error_dict['confirm_password'] = '两次密码输入不一致!'return render(request, 'my_set_password.html', locals())@login_required
def logout(request):auth.logout(request)  # 内部使用的就是 request.session.flush()return redirect("/my_login/")from django.contrib.auth.models import User
from app01 import modelsdef my_register(request):retain_dict = {'username': '','password': '','confirm_password': '','phone': '','addr': '',}error_dict = {'username': '','password': '','confirm_password': '','phone': '','addr': '',}if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')confirm_password = request.POST.get('confirm_password')phone = request.POST.get('phone')addr = request.POST.get('addr')retain_dict['username'] = usernameretain_dict['password'] = passwordretain_dict['confirm_password'] = confirm_passwordretain_dict['phone'] = phoneretain_dict['addr'] = addrprint(retain_dict)if password == confirm_password:user_queryset = models.UserInfo.objects.filter(username=username)print('user_queryset:', user_queryset)if user_queryset:error_dict['username'] = '该用户已经存在!'else:# 7. 注册:# 方式一: 密码无加密. 不推荐使用# User.objects.create(username=username, password=password)# 方式二: 创建普通用户. 密码会进行加密User.objects.create_user(username=username, password=password)# 方式三: 超级用户创建(了解). 密码会进行加密. 代码创建的email必填. 命令行创建的可以不填# User.objects.create_superuser(username=username, password=password, email='111@qq.com')retain_dict.clear()return redirect('/my_login/')else:error_dict['password'] = '两次密码输入不一致!'error_dict['confirm_password'] = '两次密码输入不一致!'return render(request, 'my_register.html', locals())

三. 扩展auth_user表

from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractUser# 第一种: 建立一对一外键关系  (不推荐)
class UserDetail(models.Model):phone = models.BigIntegerField()user = models.OneToOneField(to='User')# 第二种:面向对象的继承
class UserInfo(AbstractUser):"""提示:如果继承了AbstractUser那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了而UserInfo表中会出现auth_user所有的字段外加自己扩展的字段这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展继承的注意事项:1. 继承之前保证没有执行过数据库迁移命令保证auth_user没有被创建,如果当前库已经创建了那么你就重新换一个库2. 继承的类里面不要覆盖AbstractUser默认的的字段名表里面有的字段都不要动,只扩展额外字段即可3. 需要在settings.py配置文件中告诉django你要用UserInfo替代auth_user.AUTH_USER_MODEL = 'app01.UserInfo''应用名.表名'这句话的含义就类似于我们书写表类的完后, 执行完数据库迁移命令会生成的app01_userinfo这张表"""phone = models.BigIntegerField(verbose_name='用户手机号码')addr = models.CharField(max_length=255, verbose_name='家庭住址')# 使用: auth模块的功能还是照常使用,参考的表页只是由原来的auth_user变成了UserInfo# 原来的:from django.contrib.auth.models import UserUser.objects.create_user(username=username, password=password)# 现在的:from app01.models import UserInfoUserInfo.objects.create_use

补充: 如果auth_user表已经创建了, 还想使用. 但是你在迁移数据库执行migrate命令的时候, 会抛出异常, 那么操作方法参考如下连接即可:

ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'system.sysuser', bu-CSDN博客

关于django makemigrations/migrate在生成数据表上遇到的一些问题-CSDN博客

四. 总结

# auth模块前戏# 本质: auth模块本质就是在执行完数据库迁移命令以后, 操作django自动生成的auth_user表.   django的admin后台管理需要用到该表# 命令行创建超级用户: python3.6 manage.py createsuperuser# auth模块方法及使用
# auth模块主要提供了登录认证, 保存用户状态, 判断当前用户是否登陆, 获取当前登陆用户, 登录认证装饰器, 密码核对, 修改密码, 注销当前登录用户, 注册等功能# 登录认证from django.contrib import authuser_obj = auth.authenticate(request, username=username, password=password)  # 认证成功返回用户对象, 否则返回None# 存储用户状态提示: 该方法执行完毕之后,在任意位置都可以通过request.user获取到当前登陆的用户对象auth.login(username=username, password=password)  # 内部就是操作request.session[key]=user_obj# 获取当前用户对象request.user# 判断当前用户是否登录request.user.is_authenticated()# 登录认证装饰器from django.contrib.auth.decorators import login_required# 局部@login_required(login_url='/login/')@login_required(login_url='/this_login/')# 全局先到settings.py配置文件中配置: LOGIN_URL = '/login/'@login_required# 优先级: 局部 > 全局# 效验密码is_correct = request.user.check_password(old_password)  # 效验结果是布尔值# 修改密码request.user.set_password(new_password)request.user.save()# 注册from django.contrib.auth.models import UserUser.objects.create(username=username, password=password)           # 密码无加密 , 不推荐使用User.objects.create_user(username=username, password=password)      # 创建普通用户User.objects.create_superuser(username=username, password=password, email='111@qq.com') # 创建管理员用户, 与命令行创建方式不同的是, 必须指定邮箱# 注销auth.logout(request)# 扩展auth_user表注意事项:1. 在没执行过数据库迁移命令之前, 执行了就换库.2. 必须要继承AbstractUser类, 且自定义字段不能与其类里面冲突3. 还需要到配置文件中进行声明: AUTH_USER_MODEL = '应用名.表名'from django.db import modelsfrom django.contrib.auth.models AbstractUserclass UserInfo(AbstractUser):phone = models.CharField(max_length=255)create_time = models.DateField(auto_now_add=True)使用方式换汤不换药:from app01.models import UserInfoUser.objects.create_user(username=username, password=password, phone=phone)        

 

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

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

相关文章

使用Java编写串口程序

引言 串口是计算机与外部设备进行通信的一种常见方式。在很多领域中&#xff0c;例如物联网、嵌入式系统和工业自动化等&#xff0c;都需要通过串口与设备进行数据交互。Java作为一种跨平台的编程语言&#xff0c;在串口通信方面也提供了相应的API和库&#xff0c;方便开发者进…

Linux系统常用指令大全(图文详解)

目录 前言 一、UNIX的登录与退出 1、登录 &#xff08;1&#xff09;执行格式&#xff1a; &#xff08;2&#xff09;步骤 2、退出 二、UNIX命令格式 三、常用命令 1、目录操作 &#xff08;1&#xff09;显示目录文件 ls &#xff08;2&#xff09;建新目录 …

Android仿 美团 / 饿了么,店铺详情页功能

前言 UI有所不同&#xff0c;但功能差不多&#xff0c;商品添加购物车功能 正在写&#xff0c;写完会提交仓库。 页面主要由&#xff1a;MagicIndicator ViewPager2 Fragment CoordinatorLayout NestedScrollView RecyclerView实现。 效果图一&#xff1a;左右RecyclerV…

微机课设--汇编语言在51单片机上写一个四位十进制加法器

代码如下 KEYVAL EQU 30HKEYTM EQU 31HKEYSCAN EQU 32HDAT EQU 33HSCANLED EQU 37HS_DAT EQU 38HD_DAT EQU 39HR_DATL EQU 3AHR_DATH EQU 3BH CALFLAG EQU 3CHFLAG BIT 00HORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN:MOV SP,#5FHMOV TMOD,#01HMOV TH0,#0D8HMOV TL0,…

java中BigDecimal的介绍及使用(二)

系列文章目录 java中BigDecimal的介绍及使用&#xff0c;BigDecimal格式化&#xff0c;BigDecimal常见问题java中BigDecimal的介绍及使用(二) 文章目录 系列文章目录一、前言二、BigDecimal提供的方法2.1、stripTrailingZeros() 去除小数尾部所有的02.2、int signum()2.3、int…

Linux网络——网络层

目录 一.IP协议&#xff08;IPv4&#xff09; 二.子网划分 三.特殊的IP地址 四.IP地址的数量限制 五.私有IP地址和公网IP地址 六.路由 七.分片 一.IP协议&#xff08;IPv4&#xff09; IP协议&#xff1a;提供一种能力使得数据从一个主机发送到另一个主机的能力。 TCP协…

深度学习第1天:深度学习入门-Keras与典型神经网络结构

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 神经网络 介绍 结构 基本要素 Keras 介绍 导入 定义网络 模型训练 前馈神经网络 特点 常见类型 代码示例 反馈神经网络 特点 …

Java中的jvm——面试题+答案(JVM的高级概念和调优技巧,包括垃圾回收、内存分析、优化技术等)——第16期

涉及Java虚拟机&#xff08;JVM&#xff09;高级概念和调优技巧的面试题以及简要答案&#xff1a; 什么是JVM调优&#xff1f;有哪些常见的JVM调优参数&#xff1f; 答案&#xff1a; JVM调优是通过调整JVM的参数和配置&#xff0c;以提高Java应用程序的性能和稳定性。常见的JV…

JDK、JRE、JVM的特点和关联

Java 的三个重要的概念是 JDK&#xff08;Java Development Kit&#xff09;、JRE&#xff08;Java Runtime Environment&#xff09;和 JVM&#xff08;Java Virtual Machine&#xff09;。它们之间有着密切的关联&#xff0c;同时又有不同的职责和特点。 JDK&#xff08;Java…

laravel实现发送邮件功能

Laravel提供了简单易用的邮件发送功能&#xff0c;使用SMTP、Mailgun、Sendmail等多种驱动程序&#xff0c;以及模板引擎将邮件内容进行渲染。 1.在项目目录.env配置email信息 MAIL_MAILERsmtp MAIL_HOSTsmtp.qq.com MAIL_PORT465 MAIL_FROM_ADDRESSuserqq.com MAIL_USERNAME…

【代码】基于量子粒子群算法(QPSO)优化LSTM的风电、负荷等时间序列预测算法matlab

程序名称&#xff1a;基于量子粒子群算法&#xff08;QPSO&#xff09;优化LSTM的风电、负荷等时间序列预测算法 实现平台&#xff1a;matlab 代码简介&#xff1a;代码是基于QPSO-LSTM的负荷、光伏、风电等时间序列预测&#xff0c;MATLAB编写。包含LSTM&#xff08;长短时记…

2、用命令行编译Qt程序生成可执行文件exe

一、创建源文件 1、新建一个文件夹&#xff0c;并创建一个txt文件 2、重命名为main.cpp 3、在main.cpp中添加如下代码 #include <QApplication> #include <QDialog> #include <QLabel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QDi…

聊聊httpclient的connect

序 本文主要研究一下httpclient的connect HttpClientConnectionOperator org/apache/http/conn/HttpClientConnectionOperator.java public interface HttpClientConnectionOperator {void connect(ManagedHttpClientConnection conn,HttpHost host,InetSocketAddress loca…

(附源码)SSM环卫人员管理平台 计算机毕设36412

目 录 摘要 1 绪论 1.1背景及意义 1.2国内外研究概况 1.3研究内容 1.4 ssm框架介绍 1.5论文结构与章节安排 2 环卫人员管理平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1 功能性…

C++二分查找:统计点对的数目

本题其它解法 C双指针算法&#xff1a;统计点对的数目 本周推荐阅读 C二分算法&#xff1a;得到子序列的最少操作次数 本文涉及的基础知识点 二分查找算法合集 题目 给你一个无向图&#xff0c;无向图由整数 n &#xff0c;表示图中节点的数目&#xff0c;和 edges 组成…

Proteus仿真--基于PG12864LCD设计的指针式电子钟

本文介绍基于PG12864LCD设计的指针式电子钟&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计中时间芯片选用DS1302芯片&#xff0c;液晶选用PG12864LCD模块&#xff0c;按键K1-K3&#xff0c;K1用于时分选择&#xff0c;K2用于调整功能&#xff0c…

Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/4)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

C语言指针——从底层原理到应用

参考&#xff1a;C语言指针-从底层原理到花式技巧&#xff0c;用图文和代码帮你讲解透彻 目录 一、前言二、变量与指针的本质1. 内存地址2. 32位与64位系统3. 变量4. 指针变量5. 操作指针变量5.1 指针变量自身的值5.2 获取指针变量所指向的数据5.3 以什么样的数据类型来使用/解…

Ceph----RBD块存储的使用:详细实践过程实战版

RBD 方式的 工作 流程&#xff1a; 1、客户端创建一个pool&#xff0c;并指定pg数量&#xff0c;创建 rbd 设备并map 到文件系统&#xff1b; 2、用户写入数据&#xff0c;ceph进行对数据切块&#xff0c;每个块的大小默认为 4M&#xff0c;每个 块名字是 object序号&#xff…

分布式篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、如何将长链接转换成短链接,并发送短信?二、长链接和短链接如何互相转换?三、长链接和短链接的对应关系如何存储?四、如何提高系统的并发能力?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一…