关键词:
简单的说
- Cookie是保存在浏览器的键值对
- Session是保存在服务端的键值对
- Session是依赖于Cookie的
在Django框架中,我们可以直接操作cookie和session,但是tornado只支持cookie,那如果要使用session怎么办呢?自己定义session
基于内存实现SESSION
我们知道,在tornado
中,所有的请求都是由RequestHandler
对象来处理(以下简称handler
对象)。在RequestHandler
源码中,预留了一个钩子方法initialize
,该方法会在实例化Handler
对象时执行。因此,如果我们继承RequestHandler
类并重写initialize
,就可以完成一些自定义操作。
import os import tornado.ioloop import tornado.web from tornado.web import RequestHandler import hashlib import time # 生成一个随机的字符串 def gen_random_str(): md5 = hashlib.md5() md5.update(str(time.time()).encode(‘utf-8‘)) return md5.hexdigest() class CacheSession(object): container = def __init__(self,handler): self.handler = handler client_random_str = self.handler.get_cookie("_session_id_") if client_random_str and client_random_str in self.container: self.random_str = client_random_str else: self.random_str = gen_random_str() self.container[self.random_str] = expires = time.time() + 300 self.handler.set_cookie("_session_id_", self.random_str, expires=expires) def __setitem__(self, key, value): self.container[self.random_str][key] = value def __getitem__(self, item): return self.container[self.random_str].get(item) class SessionHandler(RequestHandler): def initialize(self): # self指代的是当前的对象 self.session = CacheSession(self) class LoginHandler(SessionHandler,RequestHandler): def get(self, *args, **kwargs): self.render(‘login.html‘) def post(self, *args, **kwargs): username = self.get_argument(‘username‘) password = self.get_argument(‘password‘) if username == ‘admin‘ and password == ‘123‘: self.session[‘username‘] = username self.redirect(‘/main‘) else: self.redirect(‘/login‘) class MainHandler(SessionHandler,RequestHandler): def get(self, *args, **kwargs): username = self.session[‘username‘] if username: self.write(‘this is main page‘) else: self.redirect(‘/login‘) def post(self, *args, **kwargs): pass settings = "static_path" : os.path.join(os.path.dirname(__file__),‘static‘), "static_url_prefix":"static", "template_path":‘views‘, "xsrf_cookies": True, def make_app(): return tornado.web.Application([ (r"/login", LoginHandler), (r"/main", MainHandler), ], **settings) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()
代码解释
-
定义一个
Session
类,其实例化时接收handler
对象- 在
Session
类中定义一个静态字段(大字典),用来存储session_id
和对应的用户信息;所有的session
对象都可以访问这个大字典。 - 在
Session
的构造方法中,获取和设置cookie
:- 调用handler对象
get_cookie()
方法获取session_id
,如果没有,则生成一段随机字符串random_str
作为session_id
- 将
session_id
写入大字典 - 调用
handler
对象的set_cookie()
方法,通知浏览器设置cookie:set-cookie: session_id: random_str
- 调用handler对象
- 在
Session
类中,定义__getitem__
,__setitem__
,__delitem__
方法来实现通过字典的方式操作session
对象
- 在
-
在
initialize
方法中为handler
对象增加session
属性,其值是Session
对象:self.session=Session(self)
;在每个路由对应的视图中都重写initialize
方法太麻烦了,利用面向对象的多继承,将这一步单独写在一个类SessionHandler
,所以视图类先继承这个类即可 - 每次请求进来,都会执行
SessionHandler
中的initialize
方法,并实例化Session
对象,从而获取session_id
- 操作
session
:- 通过
self.session[key] = value
, 即可调用session对象的__setitem__
方法来写session
; - 通过
self.session[key]
即可调用session
对象的__getitem__
方法来获取session
- 通过
del self.session[key]
即可调用session
对象的__delitem__
方法来删除session
- 通过
基于Redis实现Session
import os import tornado.ioloop import tornado.web from tornado.web import RequestHandler import hashlib import time def gen_random_str(): md5 = hashlib.md5() md5.update(str(time.time()).encode(‘utf-8‘)) return md5.hexdigest() class RedisSession(object): @property def conn(self): import redis conn = redis.Redis(host=‘192.168.11.96‘, port=6379) return conn def __init__(self,handler): self.handler = handler client_random_str = self.handler.get_cookie("_session_id_") if client_random_str and self.conn.exists(client_random_str): self.random_str = client_random_str else: self.random_str = gen_random_str() expires = time.time() + 300 self.handler.set_cookie("_session_id_", self.random_str, expires=expires) self.conn.expire(self.random_str, 300) def __setitem__(self, key, value): self.conn.hset(self.random_str, key, value) def __getitem__(self, item): return self.conn.hget(self.random_str, item) class SessionHandler(RequestHandler): def initialize(self): self.session = RedisSession(self)
工厂模式实现Session
session_code.py
class SessionFactory(object): @staticmethod def get_session(): import settings import importlib engine = settings.SESSION_ENGINE module_path,cls_name = engine.rsplit(‘.‘,maxsplit=1) md = importlib.import_module(module_path) cls = getattr(md,cls_name) return cls
app.py
from session_code import SessionFactory cls = SessionFactory.get_session() print(cls)
setting.py
SESSION_ENGINE = "session_code.RedisSession" # SESSION_ENGINE = "session_code.CacheSession" SESSION_ID = "__session__id__" EXPIRERS = 300
关于cookies和session的有效时间分析(代码片段)
今天突然有一个疑问,Cookies的有效期和Session的有效期通过php是在服务端设置的,如果过期了,客户端访问是不是就不生效了,还是服务端在内存中会销毁Session,客户端取消了Cookies字段呢?如果加上带cookies访问会有什么效果呢... 查看详情
aspnetmvc前后端分离项目手记关于token认证(代码片段)
...要解决的问题就是身份认证以往的时候,我们使用cookie+session,或者只用cookie来保持会话。 一,先来复习一下cookie和session首先我们来复习一下在aspnet中cookie和session的关系,做一个简单试验这是一个普通的view没有任何处理&nbs... 查看详情
cookie和session(代码片段)
...原理查看CookieDjango中操作Cookie获取Cookie设置Cookie删除CookieSessionSession的由来Django中Session相关方法Session流程解析Session版登陆验证Django中的Session配置CookieCookie的由来大家都知道HTTP协议是无状态的 查看详情
cookie和session(代码片段)
...原理查看CookieDjango中操作Cookie获取Cookie设置Cookie删除CookieSessionSession的由来Django中Session相关方法Session流程解析Session版登陆验证Django中的Session配置回到顶部CookieCookie的由来大家都知道HTTP协议是无状态的。无 查看详情
django学习之cookie和session(代码片段)
...okie1.获取Cookie2.设置Cookie3.删除Cookie4.Cookie版登陆校验三、Session1.Session的由来2.Session流程解析四、Django中Session操作1.相关方法2.Session版登陆验证4.Django中的Session 查看详情
理解cookie和session机制(代码片段)
...ie的路径Cookie的安全属性JavaScript操作Cookie案例:永久登录Session机制什么是Session实现用户登录Session的生命周期Session的有效期S 查看详情
cookie和session区别(代码片段)
cookie和session区别①cookie介绍说明cookie存放在浏览器缓存中---浏览器进行查看(谷歌)【设置】---【高级】---【内容设置】---【cookie】---【所有Cookie和网站数据】PS:cookie的格式信息是由开发人员进行定义,所以不同的网站所生成... 查看详情
cookie和session(代码片段)
1.cookie和session之间的关系转自https://www.cnblogs.com/andy-zhou/p/5360107.html2.浏览器没有禁用cookie时,服务器端会生成session_id存储在浏览器端中的cookie里面。 8.php页面代码如下所示1<?php2session_start();3$_SESSION[‘va‘]=‘abc‘;4$s=sessi 查看详情
cookie和session(代码片段)
Cookie和SessionCookie和SessioncookieSession流程例子cookie与HTTPCookie和Session的区别HTTP协议是一种无状态的协议,但是在现实生活中希望出现会话管理,所以出现了cookie和session机制。应用场景:例如:登录,注册…需要... 查看详情
day07cookie和session(非常重要)(代码片段)
day07Cookie和Session1.会话技术2.cookie的方法和cookie案例-显示用户上次访问网站的时间3.cookie的细节-删除cookie4.Session对象4.1配置session存活时间4.2session工作原理(基于cookie,且无有效期,即浏览器关掉cookie就消失)5.用户禁用了cookie,sess... 查看详情
cookie和session(代码片段)
一、we为什么要用cookie和session 由于http协议是无状态的,在我们日常访问对网站进行访问时,服务器需要区分当前是哪个用户在请求,这样才能根据特定的用户作出特定的响应,这样就用到了cookie和session。 二、cookie 1... 查看详情
cookies和session(代码片段)
views.py文件fromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponse,HttpResponseRedirect#Createyourviewshere.defadd_cookie1_views(request):#创建响应对象resp=HttpResponse("请求成功,将数据保存进cookie" 查看详情
cookie和session的区别详解(代码片段)
cookie和session的区别详解session和cookie区别,及应用场景cookie两者关联具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在... 查看详情
cookie和session(代码片段)
一、cookie和session的介绍cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本... 查看详情
session和cookie的区别和联系(代码片段)
...别简单说就是Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。关于CookieCookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览... 查看详情
cookie和session(代码片段)
一、cookie和session的介绍cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。cookie的工作原理是:由服务器产生内容,浏览器收到请求后保... 查看详情
session和cookie的区别(代码片段)
...用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。本文将讲解Cookie和Session以及它们的区别。CookieHTTP协议是无状态的,主要... 查看详情
cookie和session(代码片段)
cookie是保存在客户端(浏览器)的数据1.获取cookierequest.COOKIES.get(‘key‘) get形式request.COOKIES[‘key‘] 字典形式request.get_signed_cookie(‘key‘,salt=‘sdasdas‘) 加密形式 salt为加密盐defcook1(request):#获取当前 查看详情