关于cookie和session(代码片段)

mayite mayite     2022-12-31     287

关键词:

简单的说

  • 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
    • 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):#获取当前 查看详情