auth模块方法的使用

news2024/7/6 19:30:47

文章目录

      • 1、创建超级用户(管理员)
      • 2、获取表,检验密码
      • 3、保存用户状态
      • 4、获取用户对象,校验用户是否登录
      • 5、验证用户是否登录
      • 6、修改密码
      • 7、注销
      • 8、注册
      • 9、方法总结
      • 10、如何扩展auth_user表

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

"""
在创建好一个django项目后,直接执行数据库迁移命令后会自动生成很多表,  django_session   ......    其中就包括 auth_user表

django在启动之后就可以直接访问admin路由,需要输入用户名和密码,数据参考的就是auth_user表,并且还必须是管理员用户才能进入

"""

先执行数据库迁移命令生成表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H34Jp9UK-1668687124809)(E:/MarkDown/markdown/imgs/image-20221111182406068.png)]

#创建管理员用户
python manage.py createsuperuser

在这里插入图片描述

超级用户创建好之后,auth_user表中发生变化

在这里插入图片描述

路由中输入admin,登录管理员用户

在这里插入图片描述
登录进入后的界面:

在这里插入图片描述

依赖于auth_user表完成用户以下相关的所有功能:

2、获取表,检验密码

登录功能

<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <input type="submit">
</form>
# views.py

from django.shortcuts import render, redirect, HttpResponse
from django.contrib import auth

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 去用户表中校验数据
        # 1.获取表
        # 2.密码比对
        user_obj = auth.authenticate(request, username=username, password=password)
        # print(user_obj)  # 用户对象  数据不符合返回None
        # print(user_obj.username)  # 用户名
        # print(user_obj.password)  # ,密码
        
        
        """
        1.自动查找auth_user表
        2.自动给密码加密比对
        该方法的注意事项:
            括号内必须同时传入用户名和密码
            不能只传用户名
        """
        
        if user_obj:
            # 保存用户状态
            auth.login(request, user=user_obj)  # 类似于request.session[key]=user_obj
            
            """
            只要执行了该方法,就可以在任何地方通过request.user获取到当前登录的用户对象
            """ 
             return redirect('/home/')
      

    return render(request, 'login.html')

在这里插入图片描述

3、保存用户状态

# 保存用户状态
 auth.login(request, user=user_obj)  # 类似于request.session['key']=user_obj
    
 """
只要执行了该方法,就可以在任何地方通过request.user获取到当前登录的用户对象
""" 

保存用户状态后,django_session表中就多了条数据

在这里插入图片描述

在这里插入图片描述

4、获取用户对象,校验用户是否登录

def home(request):
    print(request.user)  # 拿到用户对象
    """
    自动去django_session表中查找对应的用户对象给你封装到request.user中
    """
    # 判断用户是否登录
    print(request.user.is_authenticated)
    return HttpResponse('OK!')

当删除django_session表中的数据,就表示用户没有登录过,再次查看request.user拿到什么数据

在这里插入图片描述

登陆成功后,返回当前登录的用户对象,返回True

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vq16RyAI-1668687124819)(E:/MarkDown/markdown/imgs/image-20221112210247146.png)]

5、验证用户是否登录

用户登录后才能访问(加装饰器)

"""用户登录之后才能看home"""

#  局部配置:用户没有登录跳转到login_user后面指定的网址
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')  
def home(request):
    print(request.user) 
    print(request.user.is_authenticated)
    return HttpResponse('OK!')


# 全局配置,没有登录跳转到指定页面
#配置文件settings.py
LOGIN_URL = '/login/'


from django.contrib.auth.decorators import login_required
@login_required
def home(request):
    print(request.user)  
    print(request.user.is_authenticated)
    return HttpResponse('OK!')


# 如果局部和全局都有,会跳转到局部配置,
# 局部配置的优先级大于全局配置
# 全局的好处在于无需重复写代码,但是跳转的页面很单一
# 局部的好处在于不同的视图函数在用户没有登录的情况下可以跳转到不同的页面

6、修改密码

#urls.py

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

@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)  # 自动加密,比对密码,返回布尔值
            if is_right:
                # 修改密码
                request.user.set_password(new_password)  # 仅仅是修改对象的属性
                request.user.save()  # 这一步才是真正的操作数据库,
        return redirect('login')
    return render(request, 'set_password.html', locals())
<form action="" method="post">
    {% 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">
</form>

在这里插入图片描述

7、注销

#注销
path('login_out/',views.login_out)
@login_required
def login_out(request):
    auth.logout(request)  # 类似于 request.session.flush()
    return redirect('/login/')

8、注册

<form action="" method="post">
    {% csrf_token %}
    <h1>注册</h1>
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <input type="submit">
</form>
# 注册功能
path('register/',views.register),

#views.py
from django.contrib.auth.models import User
def register(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 操作auth_user表写入数据
        User.objects.create(username=username, password=password)  # 创建数据,但是用create创建,密码没有加密处理

    return render(request, 'register.html')

在这里插入图片描述

# 创建普通用户
User.objects.create_user(username=username, password=password)

在这里插入图片描述

 # 创建超级用户(了解)
        User.objects.create_superuser(username=username,password=password)

在这里插入图片描述

9、方法总结

"""1. 比对用户名和密码是否正确"""
user_obj = auth.authenticate(request, username=username, password=password)
print(user_obj)  # 用户对象  数据不符合返回None
print(user_obj.username)  # 用户名
print(user_obj.password)  # ,密码,密文
"""2.保存用户状态"""
# 保存用户状态
 auth.login(request, user=user_obj)  # 类似于request.session['key']=user_obj
#只要执行了该方法,就可以在任何地方通过request.user获取到当前登录的用户对象
"""3. 判断当前用户是否登录"""
print(request.user.is_authenticated)
"""4. 获取当前登录用户"""
request.user
"""5. 校验用户是否登录(装饰器)"""
#  局部配置:用户没有登录跳转到login_user后面指定的网址
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')  
#全局配置
#settings.py
LOGIN_URL='/login/'
# 如果局部和全局都有,会跳转到局部配置,
# 局部配置的优先级大于全局配置
# 全局的好处在于无需重复写代码,但是跳转的页面很单一
# 局部的好处在于不同的视图函数在用户没有登录的情况下可以跳转到不同的页面
"""6.比对原密码"""
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.objects.create(username=username, password=password)  # 创建数据,但是用create创建,密码没有加密处理
# 创建普通用户
User.objects.create_user(username=username, password=password)
 # 创建超级用户(了解)
User.objects.create_superuser(username=username,password=password)

10、如何扩展auth_user表

from django.db import models
from django.contrib.auth.models import User, AbstractUser

# Create your models here.
"""扩展表的第一种方式:一对一关系   不推荐使用"""
#
# class UserDetail(models.Model):
#     phone = models.BigIntegerField()
#     user = models.OneToOneField(to='User', on_delete=models.CASCADE)

"""第二种方式:利用面向对象的继承"""

#models.py
class UserInfo(AbstractUser):
    phone = models.BigIntegerField()
    create_time = models.DateTimeField(auto_now_add=True)
    """
    如果继承了AbstractUser
    那么在执行数据库迁移命令的时候auth_user表就不会在创建出来了
    而UserInfo表中会出现auth_user表中所有的字段,外加自己扩展的字段

    这么做的好处就在于能够直接点击你自己创建的表,更加快速的完成操作及扩展

    前提:
        1.在继承之前没有执行过数据库迁移命令(auth_user没有被创建)
            如果auth_user已经被创建,那么就重新换一个库
        2.继承的类型里面不要覆盖AbstractUser里面的字段名
            表里面的字段都不要动,只扩展额外的字段即可
        3. 需要在配置文件中告诉django你要用User Info替代auth_user
            AUTH_USER_MODEL='app01.UserInfo'
                                '应用名.表名'
    """
 

在这里插入图片描述

如果自己写表替代了auth_user,那么auth模块还照常使用,参考的表也由原来的auth_user变成了现在的UserInfo

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

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

相关文章

医保医用耗材编码目录——在线查询

医保医用耗材编码目录是按照“统一分类、统一编码、统一维护、统一发布、统一管理”的总体要求下进行更新维护&#xff0c;旨在强调“分类”与“追溯”属性&#xff0c;助力将医保编码标准统一为新时期医保信息交换的通用语言。 对于医保医用耗材分类与代码数据的“分类”与“追…

高数 | 【数一】 多元函数积分学 —— 总复习框架总结

自用复习笔记。 整理参考于 2023张宇高数18讲、武忠祥十七堂课。 三重积分(质量) 概念与对称性计算 直角坐标系 先一后二法/先z后xy法/投影穿线法(柱体,侧面为柱体)先二后一法/先xy后z法/定限截面法(旋转体)柱面坐标系 = 极坐标下二重积分与定积分球面坐标系 应用 体积总…

开源版禅道的使用教程

文章目录一、禅道简介二、下载安装三、敏捷版基本功能使用四、其他版本使用一、禅道简介 1.官网介绍&#xff1a;国产开源项目管理软件。核心管理思想基于敏捷方法scrum。集产品管理、项目管理、质量管理、文档管理、组织管理和事务管理于一体。 scrum&#xff1a;迭代式增量软…

DHCP地址池耗尽攻击

DHCP地址池耗尽攻击 攻击原理简介 ​ 路由器内置的DHCP服务器&#xff0c;划定了一个地址池作为自动分配给接入终端号IP地址的范围。 ​ 攻击工具伪装成大量的接入主机&#xff0c;向路由器内的DHCP服务器请求大量的IP地址分配。 ​ 在DHCP的地址租期超时之前&#xff0c;已经分…

CentOS 7搭建Yunzai-Bot原神机器人

CentOS 7.6搭建Yunzai-Bot原神机器人 前言 目前使用较多的原神机器人&#xff1a; LittlePaimon ✨基于NoneBot2和go-cqhttp的原神Q群机器人 原神多功能机器人&#xff0c;查询游戏信息、图鉴攻略、树脂提醒等等&#xff0c;以及各种各样的好玩的功能&#xff0c;不仅仅是原神…

行业案例 | 睿眼攻击溯源组合拳让黑客攻击事件无所遁形

项目背景 近年来,网络安全形势愈发严峻&#xff0c;黑客入侵、信息泄露等信息安全事件层出不穷&#xff0c;给企业带来了巨大的经济损失。一是互联网出口应用多为Web应用&#xff0c;有效防护和监测Web应用的安全性是金融行业客户信息安全领域的一项重点工作&#xff1b;二是随…

C++11 lambda+包装器+可变参数模板

索引lambda表达式(1).什么是lambda(2).lambda基本规则(3).lambda实现原理包装器可变参数模板lambda表达式 (1).什么是lambda 假设有这样一个类 struct Goods { string _name; // 名字 double _price; // 价格 int _evaluate; // 评价 }&#xff1b;现在要将商品分别按照名字…

“健康中国”战略下如何推进公共卫生建设,海尔生物医疗给出“智慧答案”

【潮汐商业评论/原创】 公共卫生是一个老话题&#xff0c;但在新时代的背景下正在呈现出诸多新故事。在人民健康需求日益提升的当下&#xff0c;推动公共卫生服务体系的高效、便捷升级成了新时期的一大命题&#xff0c;而这一问题的答案则指向了公共卫生需要“数智化”。 在此…

Python之第十章 IO及对象列化

目录 Python之第十章 IO及对象列化 1.IO流&#xff08;IO stream&#xff09; 1.概述 2.IO流定义 3.流的分类 2.open方法 1.过程 2.缓冲区&#xff08;buffer&#xff09; 使用缓存区的必要性&#xff1a; 缓冲区分类&#xff1a; 3.格式 4.b模式 5.模式 6.文件对…

CentOS 7搭建LittlePaimon原神机器人

CentOS 7.6搭建LittlePaimon原神机器人 前言 最近小伙伴说别人的QQ群里有个原神的机器人&#xff0c;可以随时查询自己账号的角色卡信息。然后我自己查了下资料&#xff0c;发现不是很难弄&#xff0c;所以帮忙也弄了一个。 目前使用较多的原神机器人&#xff1a; LittlePaim…

SpringMVC学习篇(八)

SpringMVC拦截器 1.拦截器和过滤器的区别 过滤器拦截器servlet规范中(java ee)规范中的一部分,任何java web工程都可以使用拦截器是框架提供的,如只有在SpringMVC框架下的工程才能使用其提供的拦截器在url-pattern中配置了/*之后,可以拦截任何一切资源拦截器只会拦截控制器方…

easyrecovery工具2023最新版一键恢复丢失数据免费下载

通常&#xff0c;许多人会将工作或生活中的数据存储在我们的计算机上。很多时候&#xff0c;由于我们的误操作或其他一些问题&#xff0c;很容易错误地删除一些文件和数据。特别是&#xff0c;一些计算机故障总是会导致数据丢失&#xff0c;这是非常麻烦的。当需要重新安装系统…

JS 对象总结

对象 创建对象 有两种方式&#xff1a; 通过 new 操作符实例化一个对象&#xff0c;再添加属性。 let person new Object(); person.name "孤城浪人"; person.sayName function() { console.log(this.name); };构造函数&#xff0c;若不需要传参&#xff0…

代码随想录——单词接龙(图论)

题目 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列&#xff1a; 序列中第一个单词是 beginWord 。 序列中最后一个单词是 endWord 。 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典 wordList 中的单词。 给你两个单词 b…

AWVS的简介与安装

目录预备知识实验目的实验环境实验步骤一任务描述&#xff1a;AWVS的简介实验步骤二任务描述&#xff1a;进行AWVS10.5的安装、界面介绍和简单的使用实验步骤三任务描述&#xff1a;AWVS 11.x的安装与简单使用预备知识 Acunetix Web Vulnerability Scanner&#xff08;简称AWV…

Qtcreator中文显示乱码问题终于解决

问题描述&#xff1a;Qtcreator安装好后打印中文在控制台输出乱码&#xff08;自己也在网上查找了好久&#xff0c;终于找到解决方法了&#xff09;。 原因剖析&#xff1a;因为项目的编码与控制台的编码不一致导致的&#xff0c;而qt编码设置里并没有控制台的默认编码&#xf…

华为M-LAG跨设备链路聚合技术理论讲解

目录 为什么会出现M-LAG M-LAG基本概念 M-LAG建立过程 M-LAG的协议兼容性 M-LAG的防环机制 M-LAG正常工作流量转发 单播流量转发 组播流量转发 广播流量转发 M-LAG故障场景流量转发 上行链路故障 下行链路故障 M-LAG主设备故障 Peer-link故障 M-LAG二次故障&…

Kafka部署实验

一、实验介绍 1.1实验内容 实验在Hadoop集群上部署Kafka分布式发布订阅消息系统&#xff0c;并完成kafka消息管理验证。 1.2实验知识点 Kafka集群部署 Kafka消息处理流程 1.3实验环境 Kafka2.11 网易云平台 1.4实验资源 资源名称存储目录Kafka安装包/opt/software/pack…

工业数采网关 工业数采模块 工业数采工业数采终端硬件

计讯物联TG462工业数据采集网关&#xff0c;支持工业采集、边缘计算、无线通信、远程控制、远程运维&#xff0c;广泛应用于智慧工业远距离通信自动化管控物联网场景。计讯工业数采网关TG462接口丰富、丰富协议库、支持主流PLC&#xff0c;对接第三方云平台&#xff0c;工业级设…

【软件测试面试题】面试官:你在工作中发现最有意义的bug?让他满意的回答......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试面试中被问的问…