基于Django用户认证系统详解


Posted in Python onFebruary 21, 2018

一. 认证系统概要

create_user 创建用户

authenticate 验证登录

login 记住用户的登录状态

logout 退出登录

is_authenticated 判断用户是否登录

login_required 判断用户是否登录的装饰器

二. 创建用户和验证登录

当用户注册的时候用create_user(username,password,email)默认情况下is_active=True,is_staff=False,is_superuser=False。

底层将password用hash算法加密之后存储到数据库中。

当用户登录的时候用authenticate(username=username,password=password)验证登录,判断数据库中是否存在用户输入的账号和密码,返回一个user对象。

底层将password用hash算法加密后和数据库中password进行对比。

三. 记住用户的登录状态

当用户登录的时候用login(request,user)来记住用户的登录状态,默认将用户的id存储在session中。

login有两个参数一个是request,一个是user,user的来源必须是authenticate返回的。也就是说用login之前必须先调用authenticate。

四. 退出登录

当用户注销的时候用logout(request),只需要一个参数request。

五. 判断用户是否登录

在后台的视图函数里可以用request.user.is_authenticated()判断用户是否登录

在前端页面中可以用{% if user.is_authenticated %}{% endif %}判断用户是否登录

六. 装饰器判断用户是否登录

基于普通的视图函数可以使用@login_required来装饰,但是基于类视图的get和post方法不能直接使用@login_required来装饰。

基于类视图的装饰有以下三种:

第一种:在urls文件中导入login_requtred,直接装饰as_view()函数

url(r'^$', login_required(UserInfoView.as_view()), name='user')

第二种:自定义一个LoginRequiredView类继承View类,重写as_view()函数,并装饰as_view()函数的返回值。 我们自定义的视图类就不需要再继承View类,直接继承LoginRequiredView类就好了。

class LoginRequiredView(View):
  @classmethod
  def as_view(cls, **initkwargs):
    # 调用View类中as_view方法
    view = super(LoginRequiredView, cls).as_view(**initkwargs)
    # 调用login_required装饰器
    return login_required(view)

第三种:自定义一个LoginRequiredMixin类,重写as_view()函数,调用View中的as_view()函数,并装饰as_view()函数的返回值。 我们自定义的视图类需要先继承LoginRequiredMixin类再继承View类。这种方式的关键点在于:多继承中super()的调用顺序和__mro__的顺序是一样的。

class LoginRequiredMixin(object):
  @classmethod
  def as_view(cls, **initkwargs):
    # 调用View类中as_view方法
    view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
    # 调用login_required装饰器
    return login_required(view)

以上这篇基于Django用户认证系统详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
Python3中的真除和Floor除法用法分析
Mar 16 Python
python按行读取文件,去掉每行的换行符\n的实例
Apr 19 Python
python使用selenium实现批量文件下载
Mar 11 Python
Django框架model模型对象验证实现方法分析
Oct 02 Python
pytorch之ImageFolder使用详解
Jan 06 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
python的scipy.stats模块中正态分布常用函数总结
Feb 19 Python
Python中生成ndarray实例讲解
Feb 22 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 #Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 #Python
python中abs&map&reduce简介
Feb 20 #Python
Python中常见的异常总结
Feb 20 #Python
Python中单例模式总结
Feb 20 #Python
ubuntu安装mysql pycharm sublime
Feb 20 #Python
python中(str,list,tuple)基础知识汇总
Feb 20 #Python
You might like
自己做矿石收音机
2021/03/02 无线电
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
ThinkPHP3.1新特性之字段合法性检测详解
2014/06/19 PHP
php分页查询的简单实现代码
2017/03/14 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
Node.js事件驱动
2015/06/18 Javascript
JavaScript学习小结(7)之JS RegExp
2015/11/29 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
JavaScript运行机制实例分析
2020/04/11 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
pandas 将索引值相加的方法
2018/11/15 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
python多线程并发及测试框架案例
2019/10/15 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
关于旅游的活动方案
2014/08/15 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
预备党员考察意见范文
2015/06/01 职场文书
西柏坡观后感
2015/06/08 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL