基于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获得图片base64编码示例
Jan 16 Python
python使用calendar输出指定年份全年日历的方法
Apr 04 Python
Python3.4实现远程控制电脑开关机
Feb 22 Python
python3实现windows下同名进程监控
Jun 21 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
Python计算一个点到所有点的欧式距离实现方法
Jul 04 Python
Python实现钉钉订阅消息功能
Jan 14 Python
python线程里哪种模块比较适合
Aug 02 Python
python dir函数快速掌握用法技巧
Dec 09 Python
Numpy中的数组搜索中np.where方法详细介绍
Jan 08 Python
Pygame Rect区域位置的使用(图文)
Nov 17 Python
numpy array找出符合条件的数并赋值的示例代码
Jun 01 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
Protoss兵种对照表
2020/03/14 星际争霸
PHP+DBM的同学录程序(1)
2006/10/09 PHP
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
JS的数组迭代方法
2015/02/05 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
2015/06/26 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
js制作提示框插件
2020/12/24 Javascript
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
基于树莓派的语音对话机器人
2019/06/17 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
掌上明珠Java程序员面试总结
2016/02/23 面试题
工作说明书范文
2014/05/07 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python
MySQL慢查询优化解决问题
2022/03/17 MySQL