基于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 相关文章推荐
pycharm 使用心得(七)一些实用功能介绍
Jun 06 Python
在Python中使用SimpleParse模块进行解析的教程
Apr 11 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
Python WEB应用部署的实现方法
Jan 02 Python
Python二叉搜索树与双向链表转换算法示例
Mar 02 Python
python和c语言的主要区别总结
Jul 07 Python
python 字符串追加实例
Jul 20 Python
200行python代码实现贪吃蛇游戏
Apr 24 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
Python图片处理之图片裁剪教程
May 27 Python
Python的property属性详细讲解
Apr 11 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/04/03 PHP
php函数重载的替代方法--伪重载详解
2015/05/08 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
一个简单的js动画效果代码
2010/07/20 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
JavaScript检测原始值、引用值、属性
2016/06/20 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
vue-router 学习快速入门
2017/03/01 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
python 生成目录树及显示文件大小的代码
2009/07/23 Python
Python 中 Meta Classes详解
2016/02/13 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
蔻驰美国官网:COACH美国
2016/08/18 全球购物
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
工厂厂长岗位职责
2013/11/08 职场文书
最新的互联网创业计划书
2014/01/10 职场文书
优秀部门获奖感言
2014/02/14 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
不同意离婚答辩状
2015/05/22 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android
MySQL范围查询优化的场景实例详解
2022/06/10 MySQL