深入一下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. python令牌桶算法

    import time class TokenBucket(object): # rate是令牌发放速度,capacity是桶的大小 def __init__(self, rate, capacity ...

  2. win10安装virtualBox创建CentOS6.5虚拟机

    1.安装virtualBox 1.1.下载安装包,安装 搜索一下,或者去 VirtualBox官网下载一个. 下载第一个,兼容64,32位. 2.创建64位虚拟机 2.1.解决无法创建64位的问题 2 ...

  3. Spring整合strus2简单应用总结

    本身strus2没接触过,所以这块学的一知半解,正常不整合的还没学(接着学) step: 1.创建web工程 2.在/WEB-INF/lib引入jar包 asm-3.3.jarasm-commons- ...

  4. Java基础94 分页查询(以MySQL数据库为例)

    1.概述 分页查询,也可叫做分批查询,基于数据库的分页语句(不同数据库是不同的).  本文使用的事MySql数据库.       假设:每页显示10条数据.       Select * from c ...

  5. SpringMVC(2):Spring MVC入门

    原文出处: 张开涛 2.1.Spring Web MVC是什么 spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思 ...

  6. Coursera台大机器学习技法课程笔记07-Blending and Bagging

    这一节讲如何将得到的feature或hypothesis组合起来用于预测. 1. 林老师给出了几种方法 在选择g时,需要选择一个很强的g来确保Eval最小,但如果每个g都很弱该怎么办呢 这个时候可以选 ...

  7. inoremap nnoremap vnoremap

    原贴:https://www.xuebuyuan.com/zh-hant/1116162.html inoremap nnoremap vnoremap i insert 在插入模式有效 n 在 普通 ...

  8. javax.inject包

    javax.inject包 java提出的依赖注入标准,有别于以下传统的对象获取方式 构造方法 工厂模式 服务器定位模式(e.g. JNDI) 开发过程中是会有很多层层依赖的对象的,例如,Stopwa ...

  9. struts2使用拦截器完成登陆显示用户信息操作和Struts2的国际化

    其实学习框架,就是为了可以很好的很快的完成我们的需求,而学习struts2只是为了替代之前用的servlet这一层,框架使开发更加简单,所以作为一个小菜鸟,特别感谢那些超级无敌变态开发的框架供我们使用 ...

  10. 《Java程序性能优化》之程序优化

    这一部分主要介绍代码层的优化.了解如何编写高效而精炼的代码,正确的使用函数方法.1.字符串优化处理Java语言中,String对象可以认为是对char数组的眼神和进一步封装.它主要由3部分组成:cha ...