深入理解Django中内置的用户认证


Posted in Python onOctober 06, 2017

前言

本文主要给大家介绍了关于Django中内置用户认证的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

认证登陆

在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;

如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码。

事实上,Django已经提供了内置的用户认证功能。

在使用"python manage.py makemigrationss"和"python manage.py migrate"迁移完成数据库之后

根据配置文件settings.py中的数据库段生成的数据表中已经包含了6张进行认证的数据表,分别是

  • auth_user
  • auth_group
  • auth_group_permissions
  • auth_permission
  • auth_user_groups
  • auth_user_user_permissions

进行用户认证的数据表为auth_user

要使用Django自带的认证功能,首先要导入auth模块

from django.contrib import auth   #导入auth模块

django.contrib.auth中提供了很多方法,我们常用的有三个方法:

authenticate()

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

如果通过认证,authenticate()函数会返回一个User对象。

authenticate()函数会在User对象上设置一个属性标识,这个属性标识经过数据库验证用户名及密码。

当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象时会报错。

使用:

user=authenticate(username="uaername",password="password")
 
 login(HttpResponse,user)

这个函数接受一个HttpRequest对象,以及一个通过authenticate()函数认证的User对象

login(request)登陆用户

这个函数使用Django的session框架给某个已认证的用户附加上session_id信息。

使用:

from django.shortcuts import render,redirect,HttpResponse
 
 from django.contrib.auth import authenticate,login
 
 def auth_view(request):
  username=request.POST.GET("usernmae")  # 获取用户名
  password=request.POST.GET("password")  # 获取用户的密码
 
  user=authenticate(username=username,password=password) # 验证用户名和密码,返回用户对象
 
  if user:      # 如果用户对象存在
   login(request,user)   # 用户登陆
   return redirect("/index/")
 
  else:
   return HttpResponse("用户名或密码错误")

logout(request)注销用户

这个函数接受一个HttpResponse对象,无返回值。

当调用该函数时,当前请求的session信息全部被清除。

即使当前用户没有登陆,调用该函数也不会报错。

使用:

from django.shortcuts import render,redirect,HttpResponse
 
 from django.contrib.auth import authenticate,login,logout
 
 def logout_view(request):
  
  logout(request)  # 注销用户
  
  return redirect("/index/")

user对象的is_authenticated()

要求:

  • 用户登陆后才能访问某些页面
  • 如果用户没有登陆就访问本应登陆才能访问的页面时会直接跳转到登陆页面
  • 用户在登陆页面登陆后,又会自动跳转到之前访问的页面

方法一:

def view1(request):
  
  if not request.user.is_authenticated():
   return redirect("/login/")

方法二:

使用Django的login_requierd()装饰器

使用:

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

如果用户没有登陆,则会跳转到Django默认的登陆URL的"/accountss/login/"

login视图函数可以在settings.py文件中通过LOGIN_URL修改默认值

用户登陆成功后,会重定向到原来的路径。

user对象

User对象属性:username,password为必填项

password用哈希算法保存到数据库中

  • is_staff:判断用户是否拥有网站的管理权限
  • is_active:判断是否允许用户登陆,设置为“False”时可以不用删除用户来禁止用户登陆

User对象的方法

is_authenticated()

如果是通过auth函数返回的真实的User对象,返回值则为True。这个方法检查用户是否已经通过了认证。

is_authenticated()函数的返回值为True时,表明用户成功的通过了认证。

创建用户

使用create_user辅助函数创建用户

from django.contrib.auth.models import User
user=User.objects.create_user(username="username",password="password")

set_password(password)

使用这个方法来修改密码

使用:

from django.contrib.auth.models import User
 
 user=User.objects.get(username="username")  # 获取用户对象
 user.set_password(password="password")   # 设置对象的密码
 
 user.save()

check_password(password)

用户想修改密码的时候,首先要让用户输入原来的密码。

如果用户输入的旧密码通过密码验证,返回True。

例子一,使用set_password()方法来修改密码

from django.shortcuts import render,redirect,HttpResponse
 from django.contrib.auth.models import User
 
 def create_user(request):
 
  msg=None
 
  if request.method=="POST":
   username=request.POST.get("username"," ")   # 获取用户名,默认为空字符串
   password=request.POST.get("password"," ")   # 获取密码,默认为空字符串
   confirm=request.POST.get("confirm_password"," ") # 获取确认密码,默认为空字符串
 
   if password == "" or confirm=="" or username=="": # 如果用户名,密码或确认密码为空
    msg="用户名或密码不能为空"
   elif password !=confirm:       # 如果密码与确认密码不一致
    msg="两次输入的密码不一致"
   elif User.objects.filter(username=username):  # 如果数据库中已经存在这个用户名
    msg="该用户名已存在"
   else:
    new_user=User.objects.create_user(username=username,password=password) #创建新用户 
    new_user.save()
   
    return redirect("/index/")
  
  return render(request,"login.html",{"msg":msg})

例子二,使用login_required装饰器来修改密码

from django.shortcuts import render,redirect,HttpResponse
 from django.contrib.auth import authenticate,login,logout
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.models import User
 
 @login_required
 def change_passwd(request):
  user=request.user  # 获取用户名
  msg=None
 
  if request.method=='POST':
   old_password=request.POST.get("old_password","") # 获取原来的密码,默认为空字符串
   new_password=request.POST.get("new_password","") # 获取新密码,默认为空字符串
   confirm=request.POST.get("confirm_password","")  # 获取确认密码,默认为空字符串
 
   if user.check_password(old_password):    # 到数据库中验证旧密码通过
    if new_password or confirm:      # 新密码或确认密码为空
     msg="新密码不能为空" 
    elif new_password != confirm:     # 新密码与确认密码不一样
     msg="两次密码不一致"
 
    else:
     user.set_password(new_password)    # 修改密码
     user.save()
 
     return redirect("/index/")
   else:
    msg="旧密码输入错误"
 
  return render(request,"change_passwd.html",{"msg":msg})

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python实现三维拟合的方法
Dec 29 Python
numpy.linspace函数具体使用详解
May 27 Python
详解PyTorch手写数字识别(MNIST数据集)
Aug 16 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
Aug 31 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
python 通过邮件控制实现远程控制电脑操作
Mar 16 Python
python 双循环遍历list 变量判断代码
May 04 Python
Python 实现敏感目录扫描的示例代码
May 21 Python
Keras在训练期间可视化训练误差和测试误差实例
Jun 16 Python
Python异常处理机制结构实例解析
Jul 23 Python
Django如何实现密码错误报错提醒
Sep 04 Python
PyTorch中clone()、detach()及相关扩展详解
Dec 09 Python
Python3学习笔记之列表方法示例详解
Oct 06 #Python
python获取外网IP并发邮件的实现方法
Oct 01 #Python
Python之自动获取公网IP的实例讲解
Oct 01 #Python
使用paramiko远程执行命令、下发文件的实例
Oct 01 #Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
Oct 01 #Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 #Python
Python实现字符串反转的常用方法分析【4种方法】
Sep 30 #Python
You might like
一步一步学习PHP(7) php 字符串相关应用
2010/03/05 PHP
利用php+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
2018/11/15 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
python开发中module模块用法实例分析
2015/11/12 Python
Python+django实现简单的文件上传
2016/08/17 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
Python实现像awk一样分割字符串
2020/09/15 Python
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
2014年质量管理工作总结
2014/12/01 职场文书
2014年少先队工作总结
2014/12/03 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis