深入一下Django的用户认证和cache
深入一下Django的用户认证和cache
用户认证
首先明白一个概念,http协议是无状态的,也就是每一次交互都是独立的,那如何让服务器和客户端进行有状态的交互呢,现在较为常见的方法就是让客户端在发送请求的时候带上服务器给他的身份证(特定的cookie),以此来识别来访者的身份。
关于session和cookie
这两者的作用都是储存数据,以此方便服务器和客户端进行有状态的交互。然后cookie是确实存在于客户端的浏览器中,而session信息则是保持在服务器中,这两者之间的联系就是,这个sessionID是存放到cookie中的,每次请求,客户端都会带上这个sessionID来告诉服务器我是谁。
具体实现
通过上面讲的,实现用户认证,实际上就是维护一个有状态的交互(会话)。Django已经内置实现了session,只需要在中间件中启用session模块(这是默认启用的),那么就可以通过操作request对象的session属性,来控制这个有状态的交互。
一般的流程就像这样:
loop onetime
用户端->>服务器:用户登陆,填表单发送post请求
Note right of 服务器:服务器验证
服务器->>用户端:返回的响应中会包含sessionID
end
loop onetime
用户端->>服务器:发送的请求中带着这个sessionID
Note right of 服务器:根据请求中的sessionID去查找储存在服务器上的session
服务器->>用户端:返回特定的内容
end
实现细节
怎么验证
当中间件启用auth和session后,直接调用request.user.is_authenticated就可以知道这个请求是否验证的了。
####保存方式
可以在配置中指定SESSION_ENGINE,可以选择放在数据库、缓存、文件或者cookie中。
使用方式
在视图文件view.py中,可以直接把request.session当成字典来使用。
如果想在其他地方使用session的内容,也可以直接实例化一个数据库的连接(SessionStore)来进行交互。
过期设置
针对单个session用set_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
可以在响应头部加上ETag和last-modified,用户端在下次请求同一个页面时会带上这两个信息,服务器会先校验这两个信息,如果页面没发生变化,则直接返回一个状态码为304,body为空的响应,告诉浏览器直接使用本地缓存即可。Django提供了一个中间件ConditionalGetMiddleware来帮助我们验证这两个信息。或者可以自己手动在响应头部添加相关信息,和手动验证。
小小总结
上述的前三种方式,服务器都是或多或少先生成一个(部分)缓存页面,然后在客户端下次请求相同页面时,利用缓存来生成页面并返回(或者直接返回缓存页面,反正就不是即时生成页面);而最后一种方式,则是服务器校验请求的头部信息,看客户端所请求的页面是否在其上一次请求后有发生变化,如果没有,则返回一个304,说你直接使用本地的缓存就可以了。
深入一下Django的用户认证和cache的更多相关文章
- COOKIE与SESSION、Django的用户认证、From表单
一.COOKIE 与 SESSION 1.简介 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. ...
- python 全栈开发,Day79(Django的用户认证组件,分页器)
一.Django的用户认证组件 用户认证 auth模块 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中: 如果用户存在于数据库中,然后再验证用户 ...
- Django--分页器(paginator)、Django的用户认证、Django的FORM表单
分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['joh ...
- Django Authentication 用户认证系统
一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...
- Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API
用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...
- Django自定义用户认证
自定义一个用户认证 详细参考官方文档: https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#django.contrib.au ...
- 【django之用户认证】
一.auth模块 模块导入 from django.contrib import auth 主要方法如下: 1 .authenticate() 提供了用户认证,即验证用户名以及密码是否正确,一般 ...
- CMDB资产管理系统开发【day25】:Django 自定义用户认证
官方文档:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substituting-a-custom-user-mode ...
- django - 总结 - 用户认证组件
用户认证组件 from django.contrib import auth 从auth_user表中获取对象,没有返回None,其中密码为密文,使用了加密算法 user = auth.authent ...
随机推荐
- ubuntu cron 及 crontab 自动执行任务
Add the below line (with tweaks) to the end of /etc/crontab: 30 23 * * * root shutdown -h now At 23: ...
- mysql系列十三、mysql中replace into和duplicate key的使用区
一.创建测试表 1.创建唯一索引"b" CREATE TABLE `test2` ( `id` int(10) NOT NULL AUTO_INCREMENT, `a` varch ...
- mysql系列五、mysql中having的用法
HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似.WHERE 搜索条件在进行分组操作之前应用:而HAVING 搜索条件在进行分组操作之后应用. ...
- MariaDB基于GTID主从复制及多主复制
一.简单主从模式配置步骤(必须要mysql5.6,此处以maridb10.0.10为例) 1.配置主从节点的服务配置文件 # vim /etc/my.cnf 1.1.配置master节点: [mysq ...
- Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 inconsistent binding
1.发生原因 springAOP 里面绑定参数出现错误 核对绑定参数的名称 核对 springAOP的版本 2.aop切面表达式写的有误
- SQL聚合函数
- ssh-keygen -t rsa -b 4096 -C "邮箱"
ssh-keygen -t rsa -b 4096 -C "邮箱":这条命令的目的是为了让本地机器ssh登录远程机器上的GitHub账户无需输入密码.将这条命令分解: 1.ssh- ...
- [转]centos7 下安装MongoDB
查看MongoDB的最新版官方下载地址: https://www.mongodb.com/download-center#community 使用wget命令下载安装包 wget https://fa ...
- (六)cxf处理一些Map等复杂类型
前面讲的一些都是简单类型,cxf都支持.但是有些复杂类型,cxf是不支持,比如常用的Map类型: 下面我们在前面的实例基础上在加一个方法,比如我们现在有个需求,获取所有用用户以及对应的每个用户所有角色 ...
- 性能测试二十一:环境部署之mysql
在正常工作中,mysql应该部署到 一台独立的服务器上,不与tomcat共用服务器,由于成本原因,现部署到一起 为避免出错引起麻烦,先备份: 一:环境清理:先卸载系统自带的mysql 停止mysql: ...