基于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 13 Python
Python统计文件中去重后uuid个数的方法
Jul 30 Python
python绘制简单折线图代码示例
Dec 19 Python
Python3匿名函数用法示例
Jul 25 Python
Tornado Web Server框架编写简易Python服务器
Jul 28 Python
python 简单照相机调用系统摄像头实现方法 pygame
Aug 03 Python
分享Python切分字符串的一个不错方法
Dec 14 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 Python
python实现移动木板小游戏
Oct 09 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
新手学习PHP的一些基础知识分享
2011/07/27 PHP
php获取汉字首字母的函数
2013/11/07 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
php查询操作实现投票功能
2016/05/09 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
鼠标图片振动代码
2006/07/06 Javascript
JavaScript 对象模型 执行模型
2010/10/15 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
利用python爬取散文网的文章实例教程
2017/06/18 Python
Python中的Django基本命令实例详解
2018/07/15 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
正科级干部考察材料
2014/05/29 职场文书
2014年个人委托书范本
2014/10/13 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
增值税发票丢失证明
2015/06/19 职场文书
mysql部分操作
2021/04/05 MySQL
Ruby处理CSV数据方法详解
2022/04/18 Ruby
JavaScript前端面试组合函数
2022/06/21 Javascript