Auth认证模块

Auth认证模块

回到目录

1 Auth模块是什么

Auth模块是Django自带的用户认证模块:

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。

回到目录

2 auth模块常用方法

from django.contrib import auth

 

authenticate()

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

用法:

user = authenticate(username='usernamer',password='password')

 

login(HttpRequest, user)

该函数接受一个HttpRequest对象,以及一个经过认证的User对象。

该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。

用法:

from django.contrib.auth import authenticate, logindef my_view(request):username = request.POST['username']password = request.POST['password']user = authenticate(username=username, password=password)if user is not None:login(request, user)# Redirect to a success page.
    ...else:# Return an 'invalid login' error message....

 

logout(request)

该函数接受一个HttpRequest对象,无返回值。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

用法:

from django.contrib.auth import logoutdef logout_view(request):logout(request)# Redirect to a success page.

 

is_authenticated()

用来判断当前请求是否通过了认证。

用法:

def my_view(request):if not request.user.is_authenticated():return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

 

login_requierd()

auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。

用法:

from django.contrib.auth.decorators import login_required@login_required
def my_view(request):...

 

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

示例:

LOGIN_URL = '/login/'  # 这里配置成你项目登录页面的路由

 

create_user()

auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。

用法:

from django.contrib.auth.models import User
user = User.objects.create_user(username='用户名',password='密码',email='邮箱',...)

 

create_superuser()

auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

用法:

from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用户名',password='密码',email='邮箱',...)

 

check_password(password)

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。

用法:

ok = user.check_password('密码')

 

set_password(password)

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法!!!

用法:

user.set_password(password='')
user.save()
@login_required
def set_password(request):user = request.usererr_msg = ''if request.method == 'POST':old_password = request.POST.get('old_password', '')new_password = request.POST.get('new_password', '')repeat_password = request.POST.get('repeat_password', '')# 检查旧密码是否正确if user.check_password(old_password):if not new_password:err_msg = '新密码不能为空'elif new_password != repeat_password:err_msg = '两次密码不一致'else:user.set_password(new_password)user.save()return redirect("/login/")else:err_msg = '原密码输入错误'content = {'err_msg': err_msg,}return render(request, 'set_password.html', content)
一个修改密码的简单示例

 

User对象的属性

User对象属性:username, password

is_staff : 用户是否拥有网站的管理权限.

is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。

回到目录

3 扩展默认的auth_user表

这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!

比如,我想要加一个存储用户手机号的字段,怎么办?

聪明的你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?

答案是当然有了。

我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。

这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):"""用户信息表"""nid = models.AutoField(primary_key=True)phone = models.CharField(max_length=11, null=True, unique=True)def __str__(self):return self.username

 

注意:

按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:

# 引用Django自带的User表,继承使用时需要设置
AUTH_USER_MODEL = "app名.UserInfo"

 

再次注意:

一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。

 

转载于:https://www.cnblogs.com/Ryan-Yuan/p/11587436.html

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

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

相关文章

2021年图灵奖,花落高性能计算先驱、田纳西大学教授Jack Dongarra

来源:智源社区“我是一个数学家,对我来说,一切都是线性代数,但世界也正在看到这一点,”Jack Dongarra在采访中表示。“这是我们用来建造其它东西的材料。”他说,机器学习和人工智能中的大多数问题都可以追溯到线性代数…

万字深度好文!视觉-语言(VL)智能:任务、表征学习和大型模型

来源:AI科技评论编译:Jocelyn编辑:陈彩娴本文对视觉-语言(VL)智能按时间顺序进行了全面调研,并将这一领域的发展总结为三个阶段:第一个阶段是2014-2018年,其间,专门的模型…

day60 BBS

BBS项目目的: 带你从头到尾把django再复习一遍 公司开发项目的流程 # 1.需求分析 客户提需求但是并不是完全按照客户需求来 产品经理和架构师开发组组长 去之前架构师和开发组组长 会提前先预想一套方案 有意识的引导客户朝着自己已经想好的解决方案上去提需求 # 2.项目设计 框…

redis笔记_源码_内存分配

文件:zmoalloc.h zmoalloc.c 1.求两个整数的余数 eg: 求_n对sizeof(long)的余数(_n&(sizeof(long)-1)), 性能提升为50%~100% 左右。 转载于:https://www.cnblogs.com/water-bear/p/11598618.html

转发,脑机接口领域又一重要成果!

来源:传感器技术作者:余淼硕士学历,长期从事智能传感控制、信息通信领域研究工作。“ 以脑-机交互(BCI)为核心的神经工程技术,让人类真正可以做到“心想事成”。据首都医科大学官网报道,首都医科…

《2022城市大脑建设标准研究报告》在京正式发布

2022年3月31号,《2022城市大脑建设标准研究报告》在北京正式发布,该报告由中国指挥与控制学会,中国科学院虚拟经济与数据科学研究中心,国家创新与发展战略研究会数字治理研究中心,天府大数据研究院,远望智库…

PHP7 ini 配置大全

来自书本<<PHP7底层源码设计与实现>> 多图警告⚠️ 转载于:https://www.cnblogs.com/wlphp/p/11600566.html

涌现:21世纪科学的统一主题

来源&#xff1a;medium.com作者&#xff1a;David Pines译者&#xff1a;郭瑞东审校&#xff1a;刘志航、梁金编辑&#xff1a;邓一雪原文题目&#xff1a;Emergence: A unifying theme for 21st century science原文链接&#xff1a;https://medium.com/sfi-30-foundations-f…

福布斯:2022年计算机视觉领域五大发展趋势

来源&#xff1a;科技日报记者&#xff1a;刘霞计算机视觉&#xff08;也被称为机器视觉&#xff09;是人工智能技术最令人兴奋的应用之一。该技术旨在“教”会计算机如何“看”世界&#xff0c;它与自然语言处理及语音识别并列为机器学习领域的三大热点方向。计算机视觉技术囊…

“走近”量子模拟

来源&#xff1a;中国军网作者&#xff1a;张媛、张远、达平当下&#xff0c;量子计算在先进材料以及生物化学模拟方面正崭露头角。因为量子力学解释了这些材料的基本物理特性&#xff0c;量子计算非常适合进行模拟。那么&#xff0c;什么是量子模拟&#xff1f;量子模拟有什么…

redis笔记_源码_简单动态字符串SDS

参照:https://zcheng.ren/sourcecodeanalysis/theannotatedredissourcesds/#sds%E5%B0%8F%E7%BB%93 这里用char buf[] 而不用char* buf 的原因是方便内存释放 转载于:https://www.cnblogs.com/water-bear/p/11611804.html

redis笔记_源码_双端链表list

参考:https://redissrc.readthedocs.io/en/latest/datastruct/adlist.html 转载于:https://www.cnblogs.com/water-bear/p/11613515.html

《Science》重磅:终于完成了!迄今为止最完整的人类基因组

来源&#xff1a;生物通一个研究小组终于完成了人类基因组的序列&#xff0c;填满了基因组30亿个核苷酸的最后8%。这些区域很难放在染色体上&#xff0c;因为它们的重复性很强。在着丝粒周围&#xff0c;新增加的序列揭示了随着时间推移而增加的重复DNA层&#xff0c;这可能有助…

Meta开发了一个AI模型,尝试解决维基百科的「性别偏见」问题

来源&#xff1a;SiliconANGLE出品&#xff1a;科技行者撰文&#xff1a;海外来电图片&#xff1a;海外来电为了解决两性人物传记比例失衡的情况&#xff0c;Meta操碎了心。维基百科一直是全球访问量Top 10的网站&#xff0c;是许多人搜索历史人物与领创者资讯的第一站&#xf…

RISC-V正在采取行动,避免MIPS类的碎片化

来源&#xff1a;半导体行业观察在技术重量级人物的支持下&#xff0c;RISC-V 不断增长&#xff0c;但也带来了挑战&#xff1a;鼓励 CPU 设计人员保持一致&#xff0c;并避免MIPS和Android中发生的那种碎片化。考虑到这一点&#xff0c;协调开源指令集架构 (ISA) 开发的 RISC-…

复旦副教授魏忠钰:AI和人类对垒「奇葩说」,如何打造智能辩手?

来源&#xff1a; 智源社区作者&#xff1a;魏忠钰整理&#xff1a;熊宇轩导读&#xff1a;想象一下&#xff0c;在一场AI和人类对垒的「奇葩说」&#xff0c;智能辩手的表现会如何&#xff1f;论辩的过程&#xff0c;既需要理解对方的表达&#xff0c;同时根据对方的观点生成自…

EleutherAI:当OpenAI不够开放时,我们该如何选择?

来源&#xff1a;ScienceAI编辑&#xff1a;萝卜皮人工智能最令人不安的事情之一是它超越了人类控制、遏制或规范它的权力。然而&#xff0c;它可能会产生可怕的结果&#xff0c;例如药物发现人工智能最近错误地发现了可用作化学武器的致命毒素。今天&#xff0c;没有比 Eleuth…

星地融合→→→6G移动通信关键技术的未来

来源&#xff1a;人民邮电报作者&#xff1a;柯文卫星通信与地面移动通信融合构建全球无缝覆盖的星地融合网络&#xff0c;这一趋势作为未来6G网络技术发展的重要方向得到业界广泛认可&#xff0c;成为当前学术界和产业界研究的热点。  中国信科副总经理、专家委主任&#xf…

这就是深度学习如此强大的原因

来源&#xff1a;ScienceAI编译&#xff1a;绿萝据报道称&#xff0c;由于采用基于云的技术和在大数据中使用深度学习系统&#xff0c;深度学习的使用在过去十年中迅速增长&#xff0c;预计到 2028 年&#xff0c;深度学习的市场规模将达到 930 亿美元。但究竟什么是深度学习&a…

Java基础语法之Map

浅谈Map及其遍历的四种方式 Map简介 Map提供了一种映射关系&#xff0c;其中的元素是以键值对&#xff08;key-value&#xff09;的形式存储的&#xff0c;Map中的键值对以Entry类型的对象实例形式存在&#xff1b;Map集合没有继承Collection接口,其提供的是key到value的映射…