auth模块


一、auth认证模块

前戏:在刚学习django的时候我们发现django自带一个admin路由,但是需要我们提供管理员账号和密码,接下去学习的过程中,我们又发现数据库迁移后创建了十多张新的表,大部分我们都没有研究,其中的一张表就是专门用来配合Auth模块做用户的登录、校验用户是否登录、修改密码、注销登录等功能的。

如果想要使用admin后台管理 需要先创建表 然后创建管理员账号。

直接执行数据库迁移命令即可产生默认的auth_user表 该表就是admin后台管理默认的认证表。

创建超级管理员的命令

	python38 manage.py createsuperuser

image

基于auth_user表编写用户相关的各项功能

  • 登录、校验用户是否登录、修改密码、注销登录等都是在这张表完成的.

二、auth认证相关模块及操作

功能及方法介绍

说在前面

auth封装了很多方法,他让我们不需要自己编写逻辑判断用户信息是否正确(不止这个一个功能哦).

部分属性功能介绍

字段 释义
id ID
password 密码
last_login 最后登录时间
is_superuser 是否是管理员
username 用户名
first_name
last_name
email 邮箱
is_staff 是否是工作人员
is_active 是否激活
date_joined 创建时间

导入auth模块

from django.contrib import auth

在执行auth模块相关操作前要先导入数据库中的表

from django.contrib.auth.models import User

用户注册功能(即用户创建)

User.objects.create_user(username=username, password=password)

判断用户名和密码是否正确

from django.contrib.auth.models import User
1.普通用户
user = User.objects.create_user(username='用户名',password='密码',...)
2.管理员用户,必须要有email
user = User.object.create_superuser(username='用户名',password='密码',email='邮箱',...)

判断用户是否登录

request.user.is_authenticated

如果登陆了,结果为布尔值Ture,否则为False

获取登录用户对象数据

request.user

用户信息可以在user中用点的方式获取

校验用户是否登录装饰器

	from django.contrib.auth.decorators import login_required
    我们如果不指定这里的url,就不会跳转到我们制作的登陆页面.
    @login_required(login_url='/login/')  局部配置 
    @login_required						全局配置
 	 配置文件中LOGIN_URL = '/login/'
     配置文件中修改,会让全局的@login_required影响下的视图函数/类全都跳转向一个页面

校验原密码是否正确

request.user.check_password(原密码)

修改密码

	request.user.set_password(新密码)
 	request.user.save()

退出登录

auth.logout(request)

部分功能操作代码展示

		'''判断当前用户有没有登录操作'''
		html
		    <form 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
			def login(request):		
			    print(request.user)
			    '''
			        用户登录成功之后执行Auth.login 该方法返回当前登录用户对象  admin
			        用户没有登录成功没有执行Auth.login 该方法返回匿名用户对象  AnonymousUser
			    '''
			    print(request.user.is_authenticated)    # 判断当前用户是否登录 返回True False
			    if request.method == 'POST':
			        username = request.POST.get('username')
			        password = request.POST.get('password')
			        # 现在遇到一个问题就是怎么通过models.的方式去操作auth_user表格呢? 这个时候就有auth模块了
			        res = auth.authenticate(request, username=username, password=password)
			        # print(res.username, res.password,
			        #       res.pk)  # admin pbkdf2_sha256$150000$4NZp3wuIgf9A$7hfw7pcm35QosjTRWFpj9U3F5SoGTRqUv/H8DpBp308= 2
			        '''数据正确的情况下会有一个返回值是数据对象 数据错误的情况下返回的是None'''
			        if res:
			            auth.login(request, res)    # 自动操作Cookie与Session
			    return render(request, 'login.html')


		'''
		用户登录装饰器
		当用户没有登录的情况下跳转到注册界面 在settings文件中设置跳转的页面地址 LOGIN_URL = '/login/'
		'''
		
		from django.contrib.auth.decorators import login_required

		@login_required
		def index(request):
		    return HttpResponse('Form index view')
		
		@login_required
		def func(request):
		    return HttpResponse('Form func view')

		'''重置密码'''
		views
			@login_required
			def set_password(request):
			    if request.method == 'POST':
			        old_password = request.POST.get('old_password')
			        new_password = request.POST.get('new_password')
			        '''校验原密码是否正确 自定加密并检验'''
			        is_right = request.user.check_password(old_password)
			        if is_right:
			            request.user.set_password(new_password)  # 修改密码
			            request.user.save()  # 保存数据
			    return render(request, 'set_password.html')
		html
			<form action="" method="post">
			    {% csrf_token %}
			    <p>old_password:<input type="text" name=""></p>
			    <p>new_password:<input type="text" name=""></p>
			    <input type="submit">
			</form>
		
		'''自动清除Cookie与Session'''
		views
			@login_required
				def loginout(request):
				    auth.logout(request)  # 自动清楚cookie和Session
				    return HttpResponse('清除成功!!!')

		'''创建用户'''
		views
			from django.contrib.auth.models import User
			
			def register(request):
			    User.objects.create(username='Like', password=123, email='120@qq.com')	# 这里创建的是普通用户 不能登录管理员系统
			    return HttpResponse('注册成功!!!')

image

三、扩展auth_user表

如果我们既想使用auth模块的功能,并且又想扩展auth_user表的字段,有以下两种方式:

  • 思路1:一对一字段关联

因为操作相对繁琐,不建议使用.

image

  • 思路2:替换auth_user表

我们点进调入的User表查看源码,我们发现他只是继承了AbstractUser模块,然后点进AbstractUser源码,我们发现他就相当于一张模型表,配置了auth需要使用的表的具体内容.因此我们可以自己定义一个模型表,只要导入父类AbstractUser即可自定义功能.

操作简单,推荐使用.

	步骤1:模型层编写模型类继承AbstractUser
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
        # 填写AbstractUser表中没有的字段
        phone = models.BigIntegerField()
        desc = models.TextField()
 	步骤2:一定要在配置文件中声明替换关系(把表替换成我们自定义的模型表)
        AUTH_USER_MODEL = 'app01.UserInfo'
	ps:替换还有一个前提 就是数据库迁移没有执行过(auth相关表没有创建)


posted @   致丶幻  阅读(13)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
  1. 1 So Far Away (Acoustic) Adam Christopher
  2. 2 雪 Distance Capper&罗言RollFlash
  3. 3 CollapsingWorld
  4. 4 Call You Tonight Johnta Austin
雪 Distance - Capper&罗言RollFlash
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

词:Capper/罗言

曲:Capper/罗言

编曲:IOF

混音:刘城函

母带:张步若@RSS

可怜像扑火飞蛾

任凭无用的勇敢将我淹没

你充满防备的样子不像我

会不会太久

久到这结果

明明我想要却不敢对你说

我好想放手

却幻想太多

悲叹你不是世上另一个我

我愿把胸膛解剖

公开脆弱的结构

有在跳动的血肉

别再只丢我骨头

心甘情愿囚禁在深渊

舔舐着伤口和刀尖

可是雪 飘进双眼

看不见你桥牌的谎言

心甘情愿囚禁在深渊

烧一捧雪花做硝烟

为什么抿下嘴唇尝起来像铁锈

我怕这沼泽死水就要将我淹没

快要变成玩偶

可以随意玩弄

只要和你联手

我愿把胸膛解剖

公开脆弱的结构

有在跳动的血肉

别再只丢我骨头

在这么冷的天

再靠近我一点

可是雪 飘进双眼

看不见你桥牌的谎言

心甘情愿囚禁在深渊

心甘情愿囚禁在深渊

烧一捧雪花做硝烟

点击右上角即可分享
微信分享提示