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)
相关文章:
auth模块
一. auth模块前戏 # 引入:其实我们在创建好一个django项目之后直接执行数据库迁移命令会自动生成很多表 例如:django_sessionauth_user我们知道django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且还必须是管…...
H5ke12--3--iframe--编辑邮箱的制作
下面我们来window.iframes[] frames是一个全局变量,它是一个对象数组,其中包含当前窗口中的所有框架(如果存在)。 在这段代码中,let frameframes[0];是将第一个框架赋值给变量frame。通过frame.document.designMode&q…...
Python面经【3】
零、可迭代对象 可迭代对象是迭代器和生成器的基础,简单来说,可以使用for循环遍历的对象就是可迭代对象,比如常见的list、set和dict。在python中,可迭代对象是指实现了__iter__()方法的对象,当我们使用for循环遍历一个…...
Python集合类型
目录 目标 版本 官方文档 集合分类 实战 创建 循环 常用方法 目标 掌握set和frozenset两种集合的使用方法,包括:创建、交集、并集、差集等操作。 版本 Python 3.12.0 官方文档 Set Types — set, frozensethttps://docs.python.org/3/library/s…...
npm install报错常用解题思路
最近刚接手一个“新”项目,让我很无语。明明是去年起的项目,但是它所用的部分技术栈非常旧,我启动项目,控制台一堆warning报错,然后项目结构也很让我不适应,很多地方都可以用文件夹包一下来方便定位。哎&am…...
conda: error: argument COMMAND: invalid choice
简介 使用conda activate 时,可能会报:conda: error: argument COMMAND: invalid choice: ‘activate’ (choose from ‘clean’, ‘compare’, ‘config’, ‘create’, ‘info’, ‘init’, ‘install’, ‘list’, ‘notices’, ‘package’, ‘remo…...
数仓成本下降近一半,StarRocks 存算分离助力云览科技业务出海
成都云览科技有限公司倾力打造了凤凰浏览器,专注于为海外用户提供服务,公司致力于构建一个全球性的数字内容连接入口,为用户带来更为优质、高效、个性化的浏览体验。 作为数据驱动的高科技公司,从数据中挖掘价值一直是公司核心任务…...
Apache基线检查
一、确保对OS根目录禁用覆盖 当 AllowOverride 指令设置为 None 时,Apache 将禁止在该目录下使用 .htaccess 文件来覆盖任何配置项。这意味着,除非您在主配置文件中显式地指定,否则该目录下的任何 .htaccess 文件都将被忽略。 禁用 .htaccess 文件可以提高服务器的安全性,因…...
flink的集成测试
背景 日常测试中我们使用flink的TestHarness只能测试单个算子,很多情况下我们需要集成测试来测试真正的问题,所以在flink中进行集成测试还是非常有必要的,本文就来记录下如何在flink中进行集成测试 flink中进行集成测试 flink中进行集成测…...
gitee推荐-1Panel
以下内容来源于gitee。 gitee地址:1Panel: 🔥 🔥 🔥 现代化、开源的 Linux 服务器运维管理面板。 大概和宝塔类似,但支持docker。在线体验:https://demo.1panel.cn/ 稍微试了下,没找到apache,…...
GEE 22:基于GEE实现物种分布模型(更新中。。。。。。)
物种分布模型 1. 数据点准备1.1 数据加载1.2 去除指定距离内的重复点1.3 定义研究区范围1.4 选择预测因子 1. 数据点准备 1.1 数据加载 首先需要将CSV文件导入到GEE平台中,同样也可以导入shp格式文件。 // 1.Loading and cleaning your species data *************…...
阿里云windwos 安装oracle数据库,外部用工具连接不上,只能在服务器本机通过127.0.0.1 连接
1. 首先检查阿里云服务器安全组端口是否开放 oracle 数据库端口 2. 其次找到oracle 安装的目录,打开这俩个文件,将localhost 修改为 服务器本机名称 3.重启oracle 监听服务,就可以连接了...
UniApp 中的 image 属性讲解
在 UniApp 中,image 是用于显示图片的组件,它具有多种属性,可以控制图片的展示方式和行为。下面我将为您讲解一些常用的 image 属性。 基本属性 src:指定要显示的图片资源路径,可以是本地路径或远程 URL。mode&#…...
卷积神经网络(CNN)车牌识别
文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据3.数据可视化4.标签数字化 二、构建一个tf.data.Dataset1.预处理函数2.加载数据3.配置数据 三、搭建网络模型四、设置动态学习率五、编译六、训练八、保存和…...
弹窗concrt140.dll丢失的解决方法,深度解析concrt140.dll丢失的原因
在计算机使用过程中,我们经常会遇到一些错误提示或者系统崩溃的情况。其中,concrt140.dll是一个常见的错误提示,这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题,本文将介绍5种详细的解决方法,帮助您恢…...
CANdelaStudio 使用教程4 编辑State
文章目录 简述1、State Groups2、Dependencies3、 Defaults State1、 会话状态2、 新增会话状态3、 编辑 服务对 State 的依赖关系 State Diagram 简述 1、State Groups 2、Dependencies 在这里,可以编辑现有服务在不同会话状态或安全访问状态的支持情况和状态转换…...
FANUC机器人到达某个点位时,为什么不显示@符号?
FANUC机器人到达某个点位时,为什么不显示@符号? 该功能由变量$MNDSP_POSCF = 0(不显示)/1(显示)/2(光标移动该行显示) 控制,该变量设置为不同的值,则启用对应的功能。 如下图所示,为该变量设置不同的值时的对比, 其他常用的系统变量可参考以下内容: 在R寄存器指定速度…...
JVM运行参数介绍 -Xms -Xmx -Xmn -Xss
文章目录 CharGPT问答Java运行参数“-Xmx2048m -Xms1024m -Xmn512m -Xss256k”如何调优jvm的运行参数 JVM相关介绍Java 虚拟机底层原理知识总结 CharGPT问答 Java运行参数“-Xmx2048m -Xms1024m -Xmn512m -Xss256k” 2023/11/26 20:30:27 这些参数是用于配置 Java 虚拟机&am…...
Hive删除符合条件的记录
Hive在使用中不支持update和delete操作,那么如果想删除部分条件的记录需要怎么操作?本文记录下解决方法。 思路:使用selectwhere选出想要保留的数据,使用insert overwrite向原表覆盖插入数据. insert overwrite table dbname.tab…...
Linux加强篇006-存储结构与管理硬盘
目录 前言 1. 从“/”开始 2. 物理设备命名规则 3. 文件系统与数据资料 4. 挂载硬件设备 5. 添加硬盘设备 6. 添加交换分区 7. 磁盘容量配额 8. VDO虚拟数据优化 9. 软硬方式链接 前言 悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
