基于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返回昨天日期的方法
May 13 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
Python多线程扫描端口代码示例
Feb 09 Python
python发送邮件脚本
May 22 Python
Python实现的简单排列组合算法示例
Jul 04 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
Django项目使用CircleCI的方法示例
Jul 14 Python
pandas 选取行和列数据的方法详解
Aug 08 Python
基于Python解密仿射密码
Oct 21 Python
python 中的paramiko模块简介及安装过程
Feb 29 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
escape unescape的php下的实现方法
2007/04/27 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
js模块加载方式浅析
2017/08/12 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
傲盾软件面试题
2015/08/17 面试题
2013年研究生毕业感言
2014/02/06 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
民事授权委托书范文
2014/08/02 职场文书
党支部班子“四风”问题自我剖析材料
2014/09/28 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
地球一小时活动总结
2015/02/27 职场文书