基于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使用新浪微博API发送微博的例子
Apr 10 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
Jun 10 Python
python判断windows系统是32位还是64位的方法
May 11 Python
python中print的不换行即时输出的快速解决方法
Jul 20 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
Python进度条实时显示处理进度的示例代码
Jan 30 Python
Python lambda表达式用法实例分析
Dec 25 Python
Python利用Xpath选择器爬取京东网商品信息
Jun 01 Python
浅谈Python中的继承
Jun 19 Python
python实现一个简单RPC框架的示例
Oct 28 Python
Python爬取网站图片并保存的实现示例
Feb 26 Python
python爬取youtube视频的示例代码
Mar 03 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
解析php中array_merge与array+array的区别
2013/06/21 PHP
php获取远程文件内容的函数
2015/11/02 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
fmt:formatDate的输出格式详解
2014/01/09 Javascript
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
js禁止表单重复提交
2017/08/29 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
简单了解python模块概念
2018/01/11 Python
python入门教程 python入门神图一张
2018/03/05 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
2020/06/18 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
Linux常见面试题
2013/03/18 面试题
《晚上的太阳》教学反思
2014/04/23 职场文书
给老婆的保证书范文
2014/04/28 职场文书
2014年文秘工作总结
2014/11/25 职场文书
产品质量保证书范本
2015/02/27 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
golang中的struct操作
2021/11/11 Golang
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL