基于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中的列表生成式与生成器学习教程
Mar 13 Python
Python 3.x读写csv文件中数字的方法示例
Aug 29 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
简单的python协同过滤程序实例代码
Jan 31 Python
Python 中导入csv数据的三种方法
Nov 01 Python
python保存二维数组到txt文件中的方法
Nov 15 Python
详解pyenv下使用python matplotlib模块的问题解决
Nov 29 Python
Django Docker容器化部署之Django-Docker本地部署
Oct 09 Python
tensorflow求导和梯度计算实例
Jan 23 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
python字符串的多行输出的实例详解
Jun 08 Python
PyMongo 查询数据的实现
Jun 28 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
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
php中动态变量用法实例
2015/06/10 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
2021/01/29 Javascript
python中pass语句用法实例分析
2015/04/30 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
python中学习K-Means和图片压缩
2017/11/20 Python
Python IDLE入门简介
2017/12/08 Python
django模板语法学习之include示例详解
2017/12/17 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
关于Python解包知识点总结
2020/05/05 Python
Django url 路由匹配过程详解
2021/01/22 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
几道Web/Ajax的面试题
2016/11/05 面试题
介绍一下Mysql的存储引擎
2015/02/12 面试题
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
小学教研工作制度
2014/01/15 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
个人投资合作协议书
2014/10/12 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
债务纠纷代理词
2015/05/25 职场文书
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js