详解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的Django框架中显示对象子集的方法
Jul 21 Python
Python中内建函数的简单用法说明
May 05 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
Face++ API实现手势识别系统设计
Nov 21 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
利用Python复制文件的9种方法总结
Sep 02 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
使用Python防止SQL注入攻击的实现示例
May 21 Python
Java多线程实现四种方式原理详解
Jun 02 Python
python爬虫多次请求超时的几种重试方法(6种)
Dec 01 Python
Selenium 安装和简单使用的实现
Dec 04 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
特转载一高手总结PHP学习资源和链接.
2006/12/05 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
2015/10/08 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
[33:42]LGD vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
python实现决策树分类
2018/08/30 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
详解Python做一个名片管理系统
2019/03/14 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
python Django的web开发实例(入门)
2019/07/31 Python
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
Sisley法国希思黎中国官网:享誉全球的奢华植物美容品牌
2019/06/30 全球购物
求职推荐信
2013/10/28 职场文书
作风建设演讲稿
2014/05/23 职场文书
实习班主任自我评价
2015/03/11 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
python区块链实现简版工作量证明
2022/05/25 Python