From 5c9796ac722c9da81f9d02f1c889347f01d6b481 Mon Sep 17 00:00:00 2001 From: niphlod Date: Thu, 11 Sep 2014 22:51:23 +0200 Subject: [PATCH] refactored pickling of sessions --- gluon/contrib/shell.py | 13 +++++++------ gluon/globals.py | 19 +++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/gluon/contrib/shell.py b/gluon/contrib/shell.py index 0a224100..8a571e42 100755 --- a/gluon/contrib/shell.py +++ b/gluon/contrib/shell.py @@ -31,12 +31,13 @@ An interactive, stateful AJAX shell that runs Python code on the server. import logging import new -import os -import cPickle +try: + import cPickle as pickle +except: + import pickle import sys import traceback import types -import wsgiref.handlers import StringIO import threading locker = threading.RLock() @@ -100,7 +101,7 @@ class History: name: the name of the global to remove value: any picklable value """ - blob = cPickle.dumps(value) + blob = pickle.dumps(value, pickle.HIGHEST_PROTOCOL) if name in self.global_names: index = self.global_names.index(name) @@ -159,7 +160,7 @@ def represent(obj): code below to determine whether the object changes over time. """ try: - return cPickle.dumps(obj) + return pickle.dumps(obj, pickle.HIGHEST_PROTOCOL) except: return repr(obj) @@ -258,7 +259,7 @@ def run(history, statement, env={}): if not name.startswith('__'): try: history.set_global(name, val) - except (TypeError, cPickle.PicklingError), ex: + except (TypeError, pickle.PicklingError), ex: UNPICKLABLE_TYPES.append(type(val)) history.add_unpicklable(statement, new_globals.keys()) diff --git a/gluon/globals.py b/gluon/globals.py index a01bc447..17893e56 100644 --- a/gluon/globals.py +++ b/gluon/globals.py @@ -28,7 +28,10 @@ from gluon.settings import global_settings from gluon import recfile import hashlib import portalocker -import cPickle +try: + import cPickle as pickle +except: + import pickle from pickle import Pickler, MARK, DICT, EMPTY_DICT from types import DictionaryType import cStringIO @@ -830,7 +833,7 @@ class Session(Storage): portalocker.lock(response.session_file, portalocker.LOCK_EX) response.session_locked = True - self.update(cPickle.load(response.session_file)) + self.update(pickle.load(response.session_file)) response.session_file.seek(0) oc = response.session_filename.split('/')[-1].split('-')[0] if check_client and response.session_client != oc: @@ -895,7 +898,7 @@ class Session(Storage): if row: # rows[0].update_record(locked=True) # Unpickle the data - session_data = cPickle.loads(row.session_data) + session_data = pickle.loads(row.session_data) self.update(session_data) response.session_new = False else: @@ -907,7 +910,7 @@ class Session(Storage): else: response.session_id = None response.session_new = True - # if there is no session id yet, we'll need to create a + # if there is no session id yet, we'll need to create a # new session else: response.session_new = True @@ -925,7 +928,7 @@ class Session(Storage): response.cookies[response.session_id_name]['expires'] = \ cookie_expires.strftime(FMT) - session_pickled = cPickle.dumps(self) + session_pickled = pickle.dumps(self, pickle.HIGHEST_PROTOCOL) response.session_hash = hashlib.md5(session_pickled).hexdigest() if self.flash: @@ -1084,7 +1087,7 @@ class Session(Storage): return True def _unchanged(self, response): - session_pickled = cPickle.dumps(self) + session_pickled = pickle.dumps(self, pickle.HIGHEST_PROTOCOL) response.session_pickled = session_pickled session_hash = hashlib.md5(session_pickled).hexdigest() return response.session_hash == session_hash @@ -1111,7 +1114,7 @@ class Session(Storage): else: unique_key = response.session_db_unique_key - session_pickled = response.session_pickled or cPickle.dumps(self) + session_pickled = response.session_pickled or pickle.dumps(self, pickle.HIGHEST_PROTOCOL) dd = dict(locked=False, client_ip=response.session_client, @@ -1152,7 +1155,7 @@ class Session(Storage): portalocker.lock(response.session_file, portalocker.LOCK_EX) response.session_locked = True if response.session_file: - session_pickled = response.session_pickled or cPickle.dumps(self) + session_pickled = response.session_pickled or pickle.dumps(self, pickle.HIGHEST_PROTOCOL) response.session_file.write(session_pickled) response.session_file.truncate() finally: