基于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中split方法用法分析
Apr 17 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
Python用UUID库生成唯一ID的方法示例
Dec 15 Python
windows下python连接oracle数据库
Jun 07 Python
python实现壁纸批量下载代码实例
Jan 25 Python
python使用锁访问共享变量实例解析
Feb 08 Python
详解python分布式进程
Oct 08 Python
Python+OpenCV图片局部区域像素值处理改进版详解
Jan 23 Python
python-itchat 获取微信群用户信息的实例
Feb 21 Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 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二分法在IP地址查询中的应用
2008/08/12 PHP
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
2007/06/29 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
深入学习JavaScript中的Rest参数和参数默认值
2015/07/28 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
vue单页缓存方案分析及实现
2018/09/25 Javascript
virtualenv实现多个版本Python共存
2017/08/21 Python
python各类经纬度转换的实例代码
2019/08/08 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
英国领先的电子、技术和办公用品购物网站:Ebuyer
2018/04/04 全球购物
英国电器零售商:PRC Direct
2018/06/21 全球购物
年度考核自我鉴定
2013/11/09 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
MySQL复制问题的三个参数分析
2021/04/07 MySQL