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

作者:renpingsheng 时间:2022-01-25 10:05:43 

前言

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

来源:http://www.cnblogs.com/renpingsheng/p/7629997.html

标签:django,内置,用户认证
0
投稿

猜你喜欢

  • Python创建xml的方法

    2021-11-25 05:59:44
  • pytorch 如何把图像数据集进行划分成train,test和val

    2023-12-26 15:28:10
  • 软件与网站设计的区别

    2009-05-04 14:30:00
  • 一行代码实现Python动态加载依赖

    2021-11-22 19:10:39
  • 如何实现论坛的树状记录表展开技术?

    2010-05-19 21:37:00
  • .net新兴日志框架Serilog简介

    2023-06-28 16:20:05
  • Python中协程用法代码详解

    2021-01-26 06:33:24
  • PHP ob缓存以及ob函数原理实例解析

    2023-11-18 17:36:14
  • Python面向对象魔法方法和单例模块代码实例

    2023-05-02 19:03:16
  • Go语言学习之数组的用法详解

    2024-04-26 17:18:34
  • Golang 删除文件并递归删除空目录的操作

    2024-02-16 04:33:06
  • Linux系统(CentOS)下python2.7.10安装

    2021-04-02 19:27:50
  • CSS背景 background 图像属性解读

    2008-08-01 18:19:00
  • 浅析golang开发Error的使用详解

    2024-05-13 10:44:31
  • 屏蔽浏览器缓存另类方法

    2023-11-21 08:09:23
  • Oracle数据库按时间进行分组统计数据的方法

    2023-07-14 13:52:56
  • mysql 5.7以上版本下载及安装图文教程

    2024-01-27 21:53:56
  • 在CentOS系统上从零开始搭建WordPress博客的全流程记录

    2024-04-28 09:19:26
  • python正则匹配查询港澳通行证办理进度示例分享

    2021-05-09 19:29:55
  • Python爬虫实现抓取电影网站信息并入库

    2023-12-25 02:42:32
  • asp之家 网络编程 m.aspxhome.com