Django学习笔记(13)——Django的用户认证组件,视图层和QuerySet API

用户认证组件的学习用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面。我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可以封装成函数,简单代码。不过推荐使用Django提供的一套用户认证组件,原理其实类似,只不过功能更强大。1,用户认证——auth模块在进行用户登录验证的时候,如果是自己写代码,就...

Django学习笔记(13)——Django的用户认证组件,视图层和QuerySet API

用户认证组件的学习

  用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面。我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可以封装成函数,简单代码。不过推荐使用Django提供的一套用户认证组件,原理其实类似,只不过功能更强大。

1,用户认证——auth模块

  在进行用户登录验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中;如果用户存在于数据库中,然后在验证用户输入的密码,这样一来,自己就需要编写大量的代码。

  事实上,Django已经提供了内置的用户认证功能,在使用“python manage.py makemigrations” 和 “python manage.py migrate” 迁移完成数据库之后,根据配置文件settings.py中的数据库段生成的数据表中已经包含了6张进行认证的数据表,分别是:

  而要进行用户认证的数据表示auth_user。

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

# auth主认证模块from django.contrib.auth.models import auth# 对应数据库,可以创建添加记录from django.contrib.auth.models import User

  

  django.contrib.auth中提供了许多方法,这里主要介绍其中三个:

1.1 authenticate()

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

  如果认证信息有效,会返回一个user对象。authenticate()会在User对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的。当我们试图登录一个从数据库中直接取出来不经过authenticate()的User对象会报错的!

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

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

1.2 login(HttpRequest,user)

  该函数接受一个HttpRequest对象,以及一个认证了的User对象,此函数使用django的session框架给某个已认证的用户附加上session id等信息。

from django.shortcuts import redirect, HttpResponsefrom django.contrib.auth import authenticate, logindef auth_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. return redirect("/index/")  else: # Return an 'invalid login' error message. return HttpResponse("username or password is incorrect")

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

1.3 logout(request)注销用户

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

  该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

  虽然使用的logout()函数,但是其本质上还是使用的是fulsh() 。我们可以查看 auth.logout()函数的源码

  从源码中发现,验证完之后,还是使用 request.session.flush() 进行删除session信息。

2,User对象

  User对象属性:username,password(必填项) password用哈希算法保存到数据库。

django Auth模块自带User模型所包含字段

username:用户名email: 电子邮件password:密码first_name:名last_name:姓is_active: 是否为活跃用户。默认是Trueis_staff: 是否为员工。默认是Falseis_superuser: 是否为管理员。默认是Falsedate_joined: 加入日期。系统自动生成。

  

2.1 user对象的is_authenticated()

  如果是真正的User对象,返回值恒为True,用于检查用户是否已经通过了认证。通过认证并不意味着用户认证拥有任何权限,甚至也不检查该用户是否处于激活状态,这只是表明用户成功的通过了认证。这个方法很重要,在后台用request.user.is_authenticated()判断用户是否已经登录,如果true则可以向前台展示request.user.name。

要求:

  • 1,用户登录后才能访问某些页面
  • 2,如果用户没有登录就访问该页面的话直接跳到登录页面
  • 3,用户在跳转的登录界面中完成登录后,自动访问跳转到之前访问的地址

方法一:

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

  

方法二:

  django已经为我们设计好了一个用于此种情况的装饰器:login_required()

  login_required():用来快捷的给某个视图添加登录校验的装饰器工具。

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

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

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

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

  

2.2 创建用户

  使用create_user辅助函数创建用户

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

  使用create_superuser()创建超级用户

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

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

  用法:

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

 

2.3 检查密码是否正确

  使用check_password(passwd)来检查密码是否正确,密码正确的话返回True,否则返回False。

ok = user.check_password('密码')

 

2.4 修改密码

  使用set_password() 来修改密码,接受要设置的新密码作为参数。

  用户需要修改密码的时候,首先让他输入原来的密码,如果给定的字符串通过了密码检查,返回True

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

user = User.objects.get(username = ' ' )user.set_password(password ='')user.save

  修改密码示例:

from django.contrib.auth.models import Userfrom django.shortcuts import HttpResponsedef register(request): # 创建用户 user_obj = User.objects.create_user(username='james', password='123') # 检查密码(一般用于修改密码前验证) ret = user_obj.check_password('123') print(ret)  # 返回False # 修改密码 user_obj.set_password('1234') # 修改后保存 user_obj.save() # 修改后检查 ret = user_obj.check_password('1234') print(ret)  # 返回True return HttpResponse("OK")

  

2.5 示例一:使用set_password() 方法来修改密码

from django.shortcuts import render,redirect,HttpResponsefrom django.contrib.auth.models import User def create_user(request):msg=Noneif 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})

  

2.6 示例二:使用login_required 装饰器 来修改密码

from django.shortcuts import render, redirect, HttpResponsefrom django.contrib.auth import authenticate, login, logoutfrom django.contrib.auth.decorators import login_requiredfrom django.contrib.auth.models import User@login_requireddef 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", "")  # 获取确认密码,默认为空字符串  
源文地址:https://www.guoxiongfei.cn/cntech/18361.html