基于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 30 Python
python 解压pkl文件的方法
Oct 25 Python
详解Python requests 超时和重试的方法
Dec 18 Python
基于python生成器封装的协程类
Mar 20 Python
python中selenium操作下拉滚动条的几种方法汇总
Jul 14 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
Python对wav文件的重采样实例
Feb 25 Python
500行python代码实现飞机大战
Apr 24 Python
Python 跨.py文件调用自定义函数说明
Jun 01 Python
Python通用验证码识别OCR库ddddocr的安装使用教程
Jul 07 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下封装较好的数字分页方法
2010/11/23 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
2018/10/15 PHP
php中关于换行的实例写法
2019/09/26 PHP
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
wxpython中Textctrl回车事件无效的解决方法
2016/07/21 Python
Python上下文管理器和with块详解
2017/09/09 Python
python日志模块logbook使用方法
2019/09/19 Python
python实现ftp文件传输功能
2020/03/20 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
Noon埃及:埃及在线购物
2019/11/26 全球购物
装潢设计实习自我鉴定
2013/09/19 职场文书
销售自荐信
2013/10/22 职场文书
运动会入场解说词300字
2014/01/25 职场文书
市场营销管理制度
2014/01/29 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
长城导游词
2015/01/30 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
理想国读书笔记
2015/06/25 职场文书
学校财务管理制度
2015/08/04 职场文书
深入理解pytorch库的dockerfile
2022/06/10 Python