基于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函数参数*args**kwargs用法实例
Dec 04 Python
python安装以及IDE的配置教程
Apr 29 Python
python实现稀疏矩阵示例代码
Jun 09 Python
Python中的__slots__示例详解
Jul 06 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
Python使用字典实现的简单记事本功能示例
Aug 15 Python
python并发编程多进程 互斥锁原理解析
Aug 20 Python
Python 变量的创建过程详解
Sep 02 Python
python函数调用,循环,列表复制实例
May 03 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 中的输出缓冲
2006/12/21 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
PHP安全上传图片的方法
2015/03/21 PHP
PHP截取发动短信内容的方法
2017/07/04 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
input 输入框内的输入事件详细分析
2010/03/17 Javascript
js防止表单重复提交实现代码
2012/09/05 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
python匿名函数的使用方法解析
2019/10/10 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
Keras自定义IOU方式
2020/06/10 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
养殖人员的创业计划书范文
2013/12/26 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
公司离职证明范本
2014/10/17 职场文书
个人作风建设总结
2014/10/23 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript
DE1107机评
2022/04/05 无线电
浅析JavaScript中的变量提升
2022/06/01 Javascript