基于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 paramiko实现ssh远程访问的方法
Dec 03 Python
python进阶教程之文本文件的读取和写入
Aug 29 Python
Python警察与小偷的实现之一客户端与服务端通信实例
Oct 09 Python
python3.5仿微软计算器程序
Mar 30 Python
Sanic框架应用部署方法详解
Jul 18 Python
Python3 列表,数组,矩阵的相互转换的方法示例
Aug 05 Python
使用python实现希尔、计数、基数基础排序的代码
Dec 25 Python
python如何基于redis实现ip代理池
Jan 17 Python
TensorFlow设置日志级别的几种方式小结
Feb 04 Python
python中线程和进程有何区别
Jun 17 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 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通过串口实现发送短信
2015/07/08 PHP
php生成二维码
2015/08/10 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
Javascript 布尔型分析
2008/12/22 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
python中的格式化输出用法总结
2016/07/28 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
Django用户身份验证完成示例代码
2020/04/03 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
python输入中文的实例方法
2020/09/14 Python
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
《灯光》教学反思
2014/02/08 职场文书
骨干教师申报材料
2014/12/17 职场文书
市场部岗位职责
2015/02/12 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
董事长致辞
2015/07/29 职场文书