Session for Tornado(Redis) - 代码分享

 

Session for Tornado(Redis)

session id的生成借用了web.py。
使用了 redis 的 hash 储存。
只有在为session赋值的时候才会生成session_id,是为了必要的情况下的使用(例如oAuth2的state和验证码) 

[代码] [Python]代码

#coding=utf8

import os, time
from core.options import options
from hashlib import sha1 class Session(object):
_prefix = "_session:"
_id = None
_skip = ['_redis','_request','_id']
def __init__(self,request):
self._redis = request.redis
self._request = request
#init session id
id = request.get_secure_cookie('sessionid')
if id and self._redis.exists(id):
self._id = id def init_session(self):
"""初始化"""
if not self._id:
self._id = self.generate_session_id()
self._request.set_secure_cookie('sessionid',self._id)
#延期过期时间
self._redis.hset(self._id,'lastActive',time.time())
self._redis.expire(self._id,options.session_maxlifetime) def generate_session_id(self):
"""Generate a random id for session"""
secret_key = self._request.settings['cookie_secret']
ip = self._request.request.remote_ip
while True:
rand = os.urandom(16)
now = time.time()
sessionid = sha1("%s%s%s%s" % (rand, now,ip, secret_key))
sessionid = self._prefix + sessionid.hexdigest()
if not self._redis.exists(sessionid):
break
return sessionid def __getattr__(self, name):
if self._id:
return self._redis.hget(self._id,name)
return object.__getattribute__(self, name) def __setattr__(self, name, value):
if not name in self._skip:
self.init_session()
self._redis.hset(self._id,name,value)
object.__setattr__(self, name, value) def __delattr__(self, name):
if not name in self._skip:
return self._redis.hdel(self._id,name)
object.__delattr__(self, name)

Session for Tornado(Redis) - 代码分享的更多相关文章

  1. 将Session放入Redis

    默认情况下,我们的PHP是以文件的形式保存Session数据,所以,每次读写会话信息,就需要去访问硬盘. 为了解决会话信息夸域名问题,即为了实现同一时刻只能一个地方登录,同时也解决读写会话信息必须访问 ...

  2. 转载:使用Tornado+Redis维护ADSL拨号服务器代理池

    我们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以 ...

  3. springboot项目中的普通Session和使用redis存储session

    普通session: session store type使用来存放session的存储方式,目前Spring boot中只支持Redis方式, 由于本应用暂无需将session放入redis的需求, ...

  4. JAVA基础代码分享--求圆面积

    问题描述 用户输入圆的半径,计算并显示圆的面积 代码分享 /** * @author hpu-gs * 2015/11/25 */ public class Circle { public stati ...

  5. JAVA基础代码分享--DVD管理

    问题描述 为某音像店开发一个迷你DVD管理器,最多可存6张DVD,实现碟片的管理. 管理器具备的功能主要有: 1.查看DVD信息. 菜单选择查看功能,展示DVD的信息. 2.新增DVD信息 选择新增功 ...

  6. JAVA基础代码分享--学生成绩管理

    问题描述: 从键盘读入学生成绩,找出最高分,并输出学生成绩等级. 成绩>=最高分-10  等级为’A’   成绩>=最高分-20  等级为’B’ 成绩>=最高分-30  等级为’C’ ...

  7. jQuery插件库代码分享 - 进阶者系列 - 学习者系列文章

    这些天将原来在网上找的jQuery插件进行了下整理,特此将代码分享出来给大家. 见下图结构. 对目录结构进行了分类.这里是插件列表. 这里总共收集了20来个插件.还有下面未进行划分的. 下面是DEMO ...

  8. .net之工作流工程展示及代码分享(四)主控制类

    现在应该讲主控制类了,为了不把系统弄得太复杂,所以就用一个类作为主要控制类(服务类),作为前端.后端.业务逻辑的控制类. WorkflowService类的类图如下: 该类的构造函数: public ...

  9. .net之工作流工程展示及代码分享(三)数据存储引擎

    数据存储引擎是本项目里比较有特色的模块. 特色一,使用接口来对应不同的数据库.数据库可以是Oracle.Sqlserver.MogoDB.甚至是XML文件.采用接口进行对应: public inter ...

随机推荐

  1. Web APIs 基于令牌TOKEN验证的实现

    Web APIs 基于令牌TOKEN验证的实现 概述: ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但 ...

  2. java实现电脑远程控制完整源代码(转)

    Java JDK1.4 的Robot对象,该对象可以完成屏幕图像截取操作,控制鼠标,键盘,如此便可以轻而易举地实现远程服务器的控制.本文向大家介绍如何用Java Robot对象实现远程服务器的控制,并 ...

  3. pxe网络安装操作系统 原理与详细过程

    摘要:在实际工作中,我们经常会遇到这样的情况:想要安装Linux但是计算机不带光驱或软驱,或者是笔记本配置的非标准的软驱和光驱,如1394接口,USB接口等,在Linux安装时所引导的Linux内核一 ...

  4. 王立平--android事件监听的3种方式

    第一种通常在activity组件的oncreate事件中直接定义,直接动作. 这样的方式每一个控件都定义一次.通常不方便. Button btn = (Button) findViewById(R.i ...

  5. 【Eclipse】Failed to load JavaHL Library

    1.选择window--->preferences->Team->SVN->SVN接口 2.选择SVNKit (Pure Java) xxxxxx  如下图所示 : 选择之后, ...

  6. VIM: 解决vi/vim中粘贴时行首出现很多缩进和空格的问题

    解决vi/vim中粘贴时行首出现很多缩进和空格的问题 http://www.jbxue.com/LINUXjishu/12232.html 由于在secureCRT中会将原来的文本原封不动的按照字符串 ...

  7. Android 四种启动模式 已看晕

    http://blog.csdn.net/zdw890412/article/details/7386314  //有点乱 http://www.cnblogs.com/fanchangfa/arch ...

  8. Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactory

    Error creating bean with name ‘org.springframework.validation.beanvalidation.LocalValidatorFactoryBe ...

  9. 基于visual Studio2013解决算法导论之046广度优先搜索

     题目 广度优先搜索 解决代码及点评 // 图的邻接表表示.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <stac ...

  10. 利用MySQL 的GROUP_CONCAT函数实现聚合乘法

    MySQL 聚合函数里面提供了加,平均数.最小,最大等,可是没有提供乘法,我们这里来利用MYSQL现有的GROUP_CONCAT函数实现聚合乘法. 先创建一张演示样例表: CREATE TABLE ` ...