深入一下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. 001_linux下的log

    如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. 以下介绍的 ...

  2. 支付宝&微信统一支付

    1.实体对应关系: Application  — 支付记录实体 --  支付记录详情 2.流程 1.生成订单选择支付类型 2.支付宝:PC端.手机端.扫码:微信:微信公众号支付.扫码支付.H5支付. ...

  3. PYTHON-流程控制之if/while/for-练习

    # 1 练习题## 简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型# 编译型:C, 谷歌翻译,一次翻译后结果后重复使用# 解释型:Python, 同声传译,边执行边 ...

  4. MySQL 命令行工具不能向表中插入中文的解决方法

    1.报错图示 解释:sname这个字段 解析出错. 2.解决方法 打开MySQL的安装目录,找到my.ini文件,把57和81行的utf8改成gbk后 保存,最后,重启MySQL的服务 即可. 3.测 ...

  5. linux 后台运行nohup & ctrl+z

    使用Linux时,经常希望有些命令结果不在前台显示,如sh脚本,耗时的命令等.一般情况下,使用 & 将命令结果后台运行,如sh test.sh,脚本后台执行. 有时候命令已经在前台执行了,需要 ...

  6. exe4j中"this executable was created with an evaluation version exe4j"的解决

    在使用exe4j时,如果您的exe4j没有注册,在运行有exe4j转换的*.jar为*.exe的可执行文件时,会提示:"this executable was created with an ...

  7. 【splunk】仪表盘导入导出

    仪表盘导出: splunk目录/etc/users/admin/search/local/data/ui/views  目录下,拷贝所有的xml文件 导入: 创建仪表盘->编辑来源   将上面导 ...

  8. hdu3183 rmq求区间最值的下标

    两个月前做的题,以后可以看看,是rmq关于求区间最值的下标 /* hdu3183 终点 给一个整数,可以删除m位,留下的数字形成一个新的整数 rmq 取n-m个数,使形成的数最小 */ #includ ...

  9. SPLAY,LCT学习笔记(三)

    前两篇讲述了SPLAY模板操作,这一篇稍微介绍一下SPLAY的实际应用 (其实只有一道题,因为本蒟蒻就写了这一个) 例:bzoj 1014火星人prefix 由于本蒟蒻不会后缀数组,所以题目中给的提示 ...

  10. kettle的下载、安装和初步使用(windows平台下)(图文详解)

    kettle的下载 žKettle可以在http://kettle.pentaho.org/网站下载                   http://sourceforge.net/projects ...