侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

框架(架构)  /  管理员 发布于 7年前   177

前言

本文主要给大家介绍了关于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 Useruser=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})

总结

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


  • 上一条:
    Django Admin 实现外键过滤的方法
    下一条:
    Django ORM框架的定时任务如何使用详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Filament v3.1版本发布(0个评论)
    • docker + gitea搭建一个git服务器流程步骤(0个评论)
    • websocket的三种架构方式使用优缺点浅析(0个评论)
    • ubuntu20.4系统中宿主机安装nginx服务,docker容器中安装php8.2实现运行laravel10框架网站(0个评论)
    • phpstudy_pro(小皮面板)中安装最新php8.2.9版本流程步骤(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2018-05
    • 2020-02
    • 2020-03
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-11
    • 2021-03
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-08
    • 2023-08
    • 2023-10
    • 2023-12
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客