Django session 详解-part II-session
Django中的session是一个高级工具,它可以让用户存储个人信息以便在下次访问网站中使用这些信息。session的基础还是cookie,但是它提供了一些更加高级的功能。请看下面的一个例子:
使用session:
这个例子中实现了一个简单的计数功能:
def test_count_session(request):
if 'count' in request.session:
request.session['count'] += 1
return HttpResponse('new count=%s' % request.session['count'])
else:
request.session['count'] = 1
return HttpResponse('No count in session. Setting to 1')
比较session和cookie的使用我们可以发现他们有一下几点不同:
- session管理更加统一和方便:每个session中的属性值可以使用查询以及修改操作。
- 虽然我们在例子中只是使用了一个整数的属性,但实际上session中还可以包含很多类型的属性,比如字典属性,并且它可以很方便地用Python中的内建方法访问它们。
虽然我们在session中设置了一个计数器count,但是如果我们抓取当前的cookie时会发现,竟然没有count这个属性!而只是设置了一个看起来似乎是唯一标识的sesionid,这当然是处于安全方面的考虑。假定用户不停地访问一个页面,比如访问了10次,那我们是不是就要对他的计数器+10次呢?显然这样做不符合实际情况,有了这个sessionid,我们就可以判断是否是同一个用户访问一个页面了。
Set-Cookie:sessionid=a92d67e44a9b92d7dafca67e507985c0;
expires=Thu, 07-Jul-2011 04:16:28 GMT;
Max-Age=1209600;
Path=/
深入了解sessionid:
默认情况下,Django会将session保存在django_session这个表中:
CREATE TABLE "django_session" (
"session_key" varchar(40) NOT NULL PRIMARY KEY,
"session_data" text NOT NULL,
"expire_date" datetime NOT NULL
);
其中的session_key就相当于cookie中保存的sessionid,而session_data就包含了当前session中的属性。如果想详细看看我们上面创建的session的信息,可以像下面这样:
from django.contrib.sessions.models import Session
#...
sess = Session.objects.get(pk='a92d67e44a9b92d7dafca67e507985c0')
print(sess.session_data)
print(sess.get_decoded())
它或许会输出类似下面的信息:
ZmEyNDVhNTBhMTk2ZmRjNzVlYzQ4NTFjZDk2Y2UwODc3YmVjNWVjZjqAAn1xAVUFY291bnRxAksG
cy4={'count': 11}
Django会保存request.session的相关信息到数据库,然后用户可以通过cookie中的sessionid对它进行各种操作。当然这些操作我们可以通过Django自带的session模块轻松操作,从而简化了程序员的工作。下面我们来详细了解一下Django中的session。
session中间件:
首先看看Django中的django.http.HttpRequest,了解一下它是如何取得session并对其属性进行操作的。the Django Book中对它有详细的介绍,我们这里就简单的说一下原理吧 ! Django中的页面请求的简单模型就像下面这样:
视图方法接受一个httprequest后,对它进行一系列的操作,然后返回一个httpresponse。而中间件增加一些额外的操作:
Django的中间件框架就是一些所谓的hook类,它设置在Django项目中的settings中的MIDDLEWARE_CLASSES内。当然您也可以添加自己的MIDDLEWARE_CLASSES。默认情况下,django.contrib.sessions.middleware.SessionMiddleware 是自动添加的。查看它的源代码,我们可以发现它实际上就是实现了2个hooks:process_request和process_response。
process_request提取当前cookie中的session KEY(也就是sessionid),其中SESSION_COOKIE_NAME就是我们说的sessionid。而request.session则包含了"session store"对象。
process_response负责保存"session store"对象并将它返回给客户端。
session的存储:
Django中可以通过设置SESSION_ENGINE属性来指定后台引擎来处理session。默认是django.contrib.sessions.backends.db。在Django安装目录中的sessions/backends下可以找到很多其他的引擎,这里就不再赘述。
不管是哪一种引擎,它都实现了一个StorageSession类,其中包含了对session的各种操作方法。
为了理解它的工作原理,假定用户想访问request.session,来看看它的工作流程:
- Session中间件的process_request实例化一个request.session,并将db.SessionStore附带session_key保存到构造函数(姑且这么叫吧,实在想不到好听的名字)。
- SessionStore的构造函数会保存session key以便用户访问。
- process_request的工作就算完成了,接着session中间件会将request传给view方法。
- SessionBase是一个类字典实例,我们可以通过Python内建的字典方法对它进行操作,例如__getitem__。它还有一个很有用的方法:_get_session(它用到了load方法,load方法是由db.SessionStore来执行的,而不是SessionBase,期间还有一些对数据的编码工作)
下面来看一个简单的例子:
def encode(self, session_dict):
"Returns the given session dictionary pickled and encoded as a string."
pickled = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL)
hash = self._hash(pickled)
return base64.encodestring(hash + ":" + pickled)
结论:
Django基于最简单的HTTP request和HTTP response而实现session的使用。希望上面的一些东西能给您带来一些灵感,如果需要详细了解session,读者可以当django官网的session文档中去找。
Django session 详解-part II-session的更多相关文章
- Cookie与Session详解
来源:<PHP核心技术与最佳实践> 列旭松 陈文 著 Cookie与Session详解读书笔记,从概念.操作.应用.注意事项以及区别等几方面详细阐述两者的基础知识,它们都是针对HTTP协议 ...
- 【Hibernate】Hibernate系列2之Session详解
Session详解 2.1.概述-一级缓存 2.2.操作session缓存方法 2.3.数据库隔离级别 2.4.持久化状态 2.5.状态转换 2.6.存储过程与触发器
- PHP5 session 详解【经典】 -- 转帖
PHP5 session 详解[经典] http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议.所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的.而越 ...
- orakill和ALTER SYSTEM KILL SESSION详解
--orakill和ALTER SYSTEM KILL SESSION详解[转]-----------------------------------------2013/11/05 一个用户进程偶尔 ...
- 巨人大哥谈Web应用中的Session(session详解)
巨人大哥谈Web应用中的Session(session详解) 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术. ...
- 网络基础 http 会话(session)详解
http 会话(session)详解 by:授客 QQ:1033553122 会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一. ...
- JavaWeb Session详解
代码地址如下:http://www.demodashi.com/demo/12756.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + ## Session的由来 上一篇博文介绍 ...
- 引用 Session详解 作者:郎云鹏
本文转载自leeldy<Session详解 作者:郎云鹏> 引用 leeldy 的 Session详解 作者:郎云鹏 目录: 一.术语session 二.HTTP协议与状态保持 三.理 ...
- 一招制胜---详解分布式系统里session同步
一招制胜---详解分布式系统里session同步 几周前,有个盆友问老王,说现在有多台服务器,怎么样来解决这些服务器间的session同步问题?老王一下就来精神了,因为在n年以前,老王还在学校和几个同 ...
- ASP.NET Session详解(转)
ASP.NET Session详解 本文章来自:http://blog.163.com/adam601@126/blog/static/22506317200932824210996/ 当用户在 We ...
随机推荐
- android数据存储之Sqlite(一)
SQLite学习笔记 1. Sqlite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ...
- 计算阶乘n!末尾0的个数
一.问题描述 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数.例如: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= ...
- Photoshop CS3 如何汉化
1. 下载汉化包 http://download.csdn.net/detail/yangtian1158/8740959 2. 将下载的.bat文件放到CS3的安装目录里即可 C:\Program ...
- HDU2490 parade
题目大意:一个n+1行m+1列的表格,每个格子两个数w和c,表示经过该格子的happy和体力消耗值tireness.现在从最下面任意处开始,可以向左向右向上走.但不能向下.每个格子不能经过两次.在每一 ...
- Tomcat在eclipse中起动成功,主页却打不开
症状: tomcat在eclipse里面能正常启动,而在浏览器中访问http://localhost:8080/不能访问,且报404错误.同时其他项目页面也不能访问. 关闭eclipse里面的tomc ...
- cent os下面的基本配置操作
二,修改Linux分辨率命令行 在root用户模式下,输入$ vi /boot/grub/grub.conf(路径可能会不一样,也可以是 /etc/grub.conf),打开grub.conf文件 我 ...
- PHP Socket 编程详解
PHP中的实现 服务端 <?php set_time_limit(0); // 设置主机和端口 $host = "127.0.0.1"; $port = 12387; // ...
- java和C++在多态实现上的区别
1:java中没有虚函数的概念,但是有抽 象函数的概念,用abstract关键字表示,java中抽象函数必须在抽象类中,而且抽象 函数不能有函数体,抽象类不能被实例化,只能由其子类实现抽象函数,如果某 ...
- adb上使用cp/mv命令的替代方法(failed on '***' - Cross-device link解决方法)
今天把玩手头的那部Android手机时碰到一个问题,即因为权限问题无法将文件复制到/system/和/data/分区中,经过一番折腾后,算是解决了,在此记录一笔.本方所涉及到的命令输入,均用斜体字表示 ...
- 宏定义中的##操作符和... and _ _VA_ARGS_ _
1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used i ...