基于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中声明只包含一个元素的元组数据方法
Aug 25 Python
Python中的startswith和endswith函数使用实例
Aug 25 Python
17个Python小技巧分享
Jan 23 Python
Swift中的协议(protocol)学习教程
Jul 08 Python
基于python socketserver框架全面解析
Sep 21 Python
Python探索之URL Dispatcher实例详解
Oct 28 Python
基于python的多进程共享变量正确打开方式
Apr 28 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
Django中create和save方法的不同
Aug 13 Python
python getpass模块用法及实例详解
Oct 07 Python
Python 去除字符串中指定字符串
Mar 05 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
Mar 31 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调用Webservice实例代码
2011/07/29 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
js charAt的使用示例
2014/02/18 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
理解JS绑定事件
2016/01/19 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
微信小程序日期选择器实例代码
2018/07/18 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
python追加元素到列表的方法
2015/07/28 Python
python绘制中国大陆人口热力图
2018/11/07 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
Python判断远程服务器上Excel文件是否被人打开的方法
2020/07/13 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
意大利制造的西装、衬衫和针对男士量身定制的服装:Lanieri
2018/04/08 全球购物
波兰补充商店:Muscle Power
2018/10/29 全球购物
大家检讨书5000字
2014/02/03 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
个人先进材料范文
2014/12/30 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL
深入浅析React中diff算法
2021/05/19 Javascript
详解JAVA的控制语句
2021/11/11 Java/Android
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL