基于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检测服务器是否正常
Feb 16 Python
Django中URLconf和include()的协同工作方法
Jul 20 Python
教你用python3根据关键词爬取百度百科的内容
Aug 18 Python
速记Python布尔值
Nov 09 Python
浅析Python 实现一个自动化翻译和替换的工具
Apr 14 Python
python实现简单日期工具类
Apr 24 Python
浅析Python 引号、注释、字符串
Jul 25 Python
python自动生成model文件过程详解
Nov 02 Python
python+selenium 脚本实现每天自动登记的思路详解
Mar 11 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
Python非单向递归函数如何返回全部结果
Dec 18 Python
Python编程根据字典列表相同键的值进行合并
Oct 05 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
很实用的一个完整email发送程序
2006/10/09 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
PHP PDO操作总结
2014/11/17 Javascript
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
jQuery编写网页版2048小游戏
2017/01/06 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
Vue 组件参数校验与非props特性的方法
2019/02/12 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
python函数局部变量用法实例分析
2015/08/04 Python
基于Python的PIL库学习详解
2019/05/10 Python
详解Python3 pandas.merge用法
2019/09/05 Python
Python操作qml对象过程详解
2019/09/26 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
python中如何写类
2020/06/29 Python
python打包多类型文件的操作方法
2020/09/21 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
党员活动日总结
2014/05/05 职场文书
本科毕业生应聘自荐信范文
2014/06/26 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js