详解Django之auth模块(用户认证)


Posted in Python onApril 17, 2018

auth模块简介

auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象,

而有了auth模块之后就可以很轻松的去验证用户的登录信息是否存在于数据库中。

除此之外,auth还对session做了一些封装,方便我们校验用户是否已登录

auth里的方法

如果想使用auth模块的方法,必须要先导入auth模块

from django.contrib import auth

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

1 、authenticate()  

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

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

user = authenticate(username='someone',password='somepassword')

2 、login(HttpRequest, user)

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

此函数使用django的session框架给某个已认证的用户附加上session id等信息。

from django.contrib.auth import authenticate, login
  
def 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.
    ...

3 、logout(request) 注销用户

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

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

4 、user对象的 is_authenticated()

要求:

1  用户登陆后才能访问某些页面,

2  如果用户没有登录就访问该页面的话直接跳到登录页面

3  用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址

方法1:

直接用auth的is_authenticated()方法验证

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

方法2:

根据request.user.username来验证,如果为空,则说明没有登录

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

方法3:

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

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

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' (这个值可以在settings文件中通过LOGIN_URL进行修改)。并传递  当前访问url的绝对路径 ( 登陆成功后,会重定向到该路径 )。

user对象

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

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

is_active : 是否允许用户登录, 设置为``False``,可以不用删除用户来禁止 用户登录

2.1 、is_authenticated()

如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。

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

2.2 、创建用户

使用 create_user 辅助函数创建用户:

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

2.3 、check_password(passwd)

user = User.objects.get(username=' ')
if user.check_password(passwd):
  ......

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

使用 set_password() 来修改密码

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

2.5 、简单示例

注册:

def sign_up(request):
 
  state = None
  if request.method == 'POST':
 
    password = request.POST.get('password', '')
    repeat_password = request.POST.get('repeat_password', '')
    email=request.POST.get('email', '')
    username = request.POST.get('username', '')
    if User.objects.filter(username=username):
        state = 'user_exist'
    else:
        new_user = User.objects.create_user(username=username, password=password,email=email)
        new_user.save()
 
        return redirect('/book/')
  content = {
    'state': state,
    'user': None,
  }
  return render(request, 'sign_up.html', content)

修改密码:

@login_required
def set_password(request):
  user = request.user
  state = None
  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:
        state = 'empty'
      elif new_password != repeat_password:
        state = 'repeat_error'
      else:
        user.set_password(new_password)
        user.save()
        return redirect("/log_in/")
    else:
      state = 'password_error'
  content = {
    'user': user,
    'state': state,
  }
  return render(request, 'set_password.html', content)

自己创建User表

需要注意的是,以上的所有操作,都是针对django自动创建的auth_user表的,我们可以看一下这张表的结构

详解Django之auth模块(用户认证)

这是django给我们自动创建的一张user表,而如果要用auth模块,就必须要使用(或继承)这张表。

继承表的好处是我们可以增加一些自己需要的字段,并且同时可以使用auth模块提供的接口、方法

下面就讲一下继承auth的方法:

1、导入AbstractUser类,并且写一个自定义的类,继承AbstractUser类,如下:

from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
  """
  用户信息
  """
  nid = models.AutoField(primary_key=True)
  telephone = models.CharField(max_length=11, null=True, unique=True)
  ......

需要注意的是,UserInfo表里就不需要有auth_user里重复的字段了,比如说username以及password等,但是还是可以直接使用这些字段的,并且django会自动将password进行加密

2、这样写完之后,还需要在setting.py文件里配置:

AUTH_USER_MODEL = 'blog.UserInfo'

这样,django就知道从blog项目下的models去查找UserInfo这张表了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python获取脚本所在目录的正确方法
Apr 15 Python
python并发编程之线程实例解析
Dec 27 Python
python版DDOS攻击脚本
Jun 12 Python
python实现二级登陆菜单及安装过程
Jun 21 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
PyCharm中配置PySide2的图文教程
Jun 18 Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 Python
python help函数实例用法
Dec 06 Python
Django debug为True时,css加载失败的解决方案
Apr 24 Python
Python实现批量自动整理文件
Mar 16 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 #Python
python中找出numpy array数组的最值及其索引方法
Apr 17 #Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 #Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 #Python
Python实现求解括号匹配问题的方法
Apr 17 #Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 #Python
对numpy中array和asarray的区别详解
Apr 17 #Python
You might like
一个简洁的多级别论坛
2006/10/09 PHP
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
php上的memcache和memcached两个pecl库
2010/03/29 PHP
php array_walk() 数组函数
2011/07/12 PHP
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
用innerhtml提高页面打开速度的方法
2013/08/02 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
微信小程序解除10个请求并发限制
2018/12/18 Javascript
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
2019/05/04 jQuery
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
python检查指定文件是否存在的方法
2015/07/06 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
python url 参数修改方法
2018/12/26 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
python计算波峰波谷值的方法(极值点)
2020/02/18 Python
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
入党申请书自我鉴定
2013/10/12 职场文书
数学专业毕业生自荐信
2013/11/10 职场文书
综合办公室主任职责
2013/12/16 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书