基于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练习程序批量修改文件名
Jan 16 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
python八大排序算法速度实例对比
Dec 06 Python
Python读取excel中的图片完美解决方法
Jul 27 Python
python利用跳板机ssh远程连接redis的方法
Feb 19 Python
Python整数对象实现原理详解
Jul 01 Python
python getopt模块使用实例解析
Dec 18 Python
使用python检查yaml配置文件是否符合要求
Apr 09 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 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像数组一样存取和修改字符串字符
2014/03/21 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
Nodejs为什么选择javascript为载体语言
2015/01/13 NodeJs
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
js面向对象编程总结
2017/02/16 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
Python之PyUnit单元测试实例
2014/10/11 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
python实现视频分帧效果
2019/05/31 Python
python cumsum函数的具体使用
2019/07/29 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
html5简介及新增功能介绍
2020/05/18 HTML / CSS
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
软件测试面试题
2015/10/21 面试题
酒店司机岗位职责
2013/12/14 职场文书
运动会入场解说词300字
2014/01/25 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
前处理班长职位说明书
2014/03/01 职场文书
群众路线党课主持词
2014/04/01 职场文书
机关保密承诺书
2014/06/03 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
不同意离婚代理词
2015/05/23 职场文书