深入一下Django的用户认证和cache

用户认证

首先明白一个概念,http协议是无状态的,也就是每一次交互都是独立的,那如何让服务器和客户端进行有状态的交互呢,现在较为常见的方法就是让客户端在发送请求的时候带上服务器给他的身份证(特定的cookie),以此来识别来访者的身份。

关于session和cookie

这两者的作用都是储存数据,以此方便服务器和客户端进行有状态的交互。然后cookie是确实存在于客户端的浏览器中,而session信息则是保持在服务器中,这两者之间的联系就是,这个sessionID是存放到cookie中的,每次请求,客户端都会带上这个sessionID来告诉服务器我是谁。

具体实现

通过上面讲的,实现用户认证,实际上就是维护一个有状态的交互(会话)。Django已经内置实现了session,只需要在中间件中启用session模块(这是默认启用的),那么就可以通过操作request对象的session属性,来控制这个有状态的交互。

一般的流程就像这样:

sequenceDiagram
loop onetime
用户端->>服务器:用户登陆,填表单发送post请求
Note right of 服务器:服务器验证
服务器->>用户端:返回的响应中会包含sessionID
end
loop onetime
用户端->>服务器:发送的请求中带着这个sessionID
Note right of 服务器:根据请求中的sessionID去查找储存在服务器上的session
服务器->>用户端:返回特定的内容
end

实现细节

怎么验证

当中间件启用authsession后,直接调用request.user.is_authenticated就可以知道这个请求是否验证的了。

####保存方式

可以在配置中指定SESSION_ENGINE,可以选择放在数据库、缓存、文件或者cookie中。

使用方式

在视图文件view.py中,可以直接把request.session当成字典来使用。

如果想在其他地方使用session的内容,也可以直接实例化一个数据库的连接(SessionStore)来进行交互。

过期设置

针对单个sessionset_expiry()来设置过期时间,也可以通过在配置中SESSION_EXPIRE_AT_BROWSER_CLOSE选择是否在浏览器关闭时清除会话信息,这都取决于具体的业务需求。

删除会话存储信息

我们知道每维护一个会话,就要存储一行数据,也就是说当会话越来越多,所要存储的数据也会越来越多。如果选择会话的存储方式为数据库或者文件系统,Django会在用户登出时自动删除掉对应的会话数据,但是如果用户不主动登出,那么就算过了过期时间,Django也不会去删除对应的会话数据,需要我们手动去执行cleansessions才行,文档是建议我们用一个定时任务cron来执行这一步。如果存储方式为缓存则没有这个问题,Django会自动删除过期会话数据。至于存储方式选择为cookie的就更加无所谓了,因为数据都只在用户端。

Cache

之前大概介绍过怎么使用Django的缓存系统,现在更深入一点介绍其使用方式。

之前使用的缓存逻辑是很粗鲁地直接整页缓存,其特点就是每个用户看到的缓存页面都是一样的,缓存有效时间内,一份缓存就可以满足所有请求,但是缺点就是不能根据特定用户返回特定页面。

使用Vary头来区分

patch_vary_header来指定以响应头部的特定信息来区分不同的缓存,比如patch_vary_header(response, 'cookie')就会根据cookie的信息来选择返回的哪一个缓存。

使用模版文件的缓存标签

可以选择缓存模版文件(template)中的某部分,也就是生成最终页面时,一部分页面来自缓存,一部分页面即时生成。

直接与缓存数据交互

可以实例化一个与缓存系统的连接,以此来存取一些更耗时的操作结果。例如有一个很复杂的数据查找,可以将结果存到缓存中,在缓存有效时间内,就可以用一次简单的查找来代替那个复杂的查找。

返回304

可以在响应头部加上ETaglast-modified,用户端在下次请求同一个页面时会带上这两个信息,服务器会先校验这两个信息,如果页面没发生变化,则直接返回一个状态码为304,body为空的响应,告诉浏览器直接使用本地缓存即可。Django提供了一个中间件ConditionalGetMiddleware来帮助我们验证这两个信息。或者可以自己手动在响应头部添加相关信息,和手动验证。

小小总结

上述的前三种方式,服务器都是或多或少先生成一个(部分)缓存页面,然后在客户端下次请求相同页面时,利用缓存来生成页面并返回(或者直接返回缓存页面,反正就不是即时生成页面);而最后一种方式,则是服务器校验请求的头部信息,看客户端所请求的页面是否在其上一次请求后有发生变化,如果没有,则返回一个304,说你直接使用本地的缓存就可以了。

深入一下Django的用户认证和cache的更多相关文章

  1. COOKIE与SESSION、Django的用户认证、From表单

    一.COOKIE 与 SESSION 1.简介 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. ...

  2. python 全栈开发,Day79(Django的用户认证组件,分页器)

    一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...

  3. Django--分页器(paginator)、Django的用户认证、Django的FORM表单

    分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['joh ...

  4. Django Authentication 用户认证系统

    一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...

  5. Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API

    用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...

  6. Django自定义用户认证

    自定义一个用户认证 详细参考官方文档: https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#django.contrib.au ...

  7. 【django之用户认证】

    一.auth模块 模块导入 from django.contrib import auth 主要方法如下: 1 .authenticate()    提供了用户认证,即验证用户名以及密码是否正确,一般 ...

  8. CMDB资产管理系统开发【day25】:Django 自定义用户认证

    官方文档:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substituting-a-custom-user-mode ...

  9. django - 总结 - 用户认证组件

    用户认证组件 from django.contrib import auth 从auth_user表中获取对象,没有返回None,其中密码为密文,使用了加密算法 user = auth.authent ...

随机推荐

  1. Nodejs+定时截图+发送邮件

    功能 每天定时截图,并把截到的图片自动通过邮件发送. 说明 代码注释已经非常详细,就不多做说明,需要的朋友自己查看代码即可,主文件Mail.js,截图文件capturePart1.js,capture ...

  2. Oracle 同步

    原文出处:http://www.cnblogs.com/zeromyth/archive/2009/08/19/1549661.html Oracle备份功能包括: 高级复制(Advanced Rep ...

  3. pl sql 存储过程 执行sql 锁死状态

    背景 这是在一个不知如何表达的项目中,我在这个项目中做的就是不知如何表达的事情.只是想着技术,到是通过这个项目把存储过程基本能用的都用了,oracle开发的技术我感觉基本都全活了.别人没搞定的我搞定了 ...

  4. 安装ClamAV对centos系统进行病毒查杀

    安装ClamAV 1.安装epel源 yum install epel-release 在安装了EPEL源后,运行下面的命令安装ClamAV # yum install clamav-server c ...

  5. 转载:分布式文件系统 - FastDFS 在 CentOS 下配置安装部署(2)

    原文:http://blog.mayongfa.cn/193.html 一.安装 Nginx 和 fastdfs-nginx-module 安装 Nginx 请看:从零开始学 Java - CentO ...

  6. Jquery hover方法使用及 mouseenter与mouseleave和 mouseover与mouseout的区别

    定义和用法 hover() 方法规定当鼠标指针悬停在被选元素上时要运行的两个函数. jQuery 1.7 版本前该方法触发 mouseenter 和 mouseleave 事件. jQuery 1.8 ...

  7. xshell xftp免费版下载方法

    第一步:进入官网 https://www.netsarang.com/ 第二步:选中Free License 第三步:选中你要下的xftp或者xsell (l两个好像不能一块下,都要单独操作) 第四步 ...

  8. 纯 Java 开发 WebService 调用测试工具(wsCaller.jar)

    注:本文来自hacpai.com:Tanken的<纯 Java 开发 WebService 调用测试工具(wsCaller.jar)>的文章 基于 Java 开发的 WebService ...

  9. vue-cli之webpack的proxyTable无效的解决方案

    最近遇到这个需要单页访问跨域后台的问题 可以按照如下设置: proxyTable: { '/list': { target: 'http://api.xxxxxxxx.com', pathRewrit ...

  10. 转:前端页面a标签嵌套a标签效果的两种解决方案

      这是由工作中的一个小改动需求得到的这个解决方案的:那个需求是这样的,如图: 需求原来是球队名字没有点击功能的,而蓝色方框两队之间的比赛点击的时候会跳转到比赛文字直播页面.现在需要要求点击球队名字要 ...