refactored pickling of sessions
This commit is contained in:
@@ -31,12 +31,13 @@ An interactive, stateful AJAX shell that runs Python code on the server.
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
import new
|
import new
|
||||||
import os
|
try:
|
||||||
import cPickle
|
import cPickle as pickle
|
||||||
|
except:
|
||||||
|
import pickle
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
import types
|
import types
|
||||||
import wsgiref.handlers
|
|
||||||
import StringIO
|
import StringIO
|
||||||
import threading
|
import threading
|
||||||
locker = threading.RLock()
|
locker = threading.RLock()
|
||||||
@@ -100,7 +101,7 @@ class History:
|
|||||||
name: the name of the global to remove
|
name: the name of the global to remove
|
||||||
value: any picklable value
|
value: any picklable value
|
||||||
"""
|
"""
|
||||||
blob = cPickle.dumps(value)
|
blob = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)
|
||||||
|
|
||||||
if name in self.global_names:
|
if name in self.global_names:
|
||||||
index = self.global_names.index(name)
|
index = self.global_names.index(name)
|
||||||
@@ -159,7 +160,7 @@ def represent(obj):
|
|||||||
code below to determine whether the object changes over time.
|
code below to determine whether the object changes over time.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return cPickle.dumps(obj)
|
return pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
|
||||||
except:
|
except:
|
||||||
return repr(obj)
|
return repr(obj)
|
||||||
|
|
||||||
@@ -258,7 +259,7 @@ def run(history, statement, env={}):
|
|||||||
if not name.startswith('__'):
|
if not name.startswith('__'):
|
||||||
try:
|
try:
|
||||||
history.set_global(name, val)
|
history.set_global(name, val)
|
||||||
except (TypeError, cPickle.PicklingError), ex:
|
except (TypeError, pickle.PicklingError), ex:
|
||||||
UNPICKLABLE_TYPES.append(type(val))
|
UNPICKLABLE_TYPES.append(type(val))
|
||||||
history.add_unpicklable(statement, new_globals.keys())
|
history.add_unpicklable(statement, new_globals.keys())
|
||||||
|
|
||||||
|
|||||||
+10
-7
@@ -28,7 +28,10 @@ from gluon.settings import global_settings
|
|||||||
from gluon import recfile
|
from gluon import recfile
|
||||||
import hashlib
|
import hashlib
|
||||||
import portalocker
|
import portalocker
|
||||||
import cPickle
|
try:
|
||||||
|
import cPickle as pickle
|
||||||
|
except:
|
||||||
|
import pickle
|
||||||
from pickle import Pickler, MARK, DICT, EMPTY_DICT
|
from pickle import Pickler, MARK, DICT, EMPTY_DICT
|
||||||
from types import DictionaryType
|
from types import DictionaryType
|
||||||
import cStringIO
|
import cStringIO
|
||||||
@@ -830,7 +833,7 @@ class Session(Storage):
|
|||||||
portalocker.lock(response.session_file,
|
portalocker.lock(response.session_file,
|
||||||
portalocker.LOCK_EX)
|
portalocker.LOCK_EX)
|
||||||
response.session_locked = True
|
response.session_locked = True
|
||||||
self.update(cPickle.load(response.session_file))
|
self.update(pickle.load(response.session_file))
|
||||||
response.session_file.seek(0)
|
response.session_file.seek(0)
|
||||||
oc = response.session_filename.split('/')[-1].split('-')[0]
|
oc = response.session_filename.split('/')[-1].split('-')[0]
|
||||||
if check_client and response.session_client != oc:
|
if check_client and response.session_client != oc:
|
||||||
@@ -895,7 +898,7 @@ class Session(Storage):
|
|||||||
if row:
|
if row:
|
||||||
# rows[0].update_record(locked=True)
|
# rows[0].update_record(locked=True)
|
||||||
# Unpickle the data
|
# Unpickle the data
|
||||||
session_data = cPickle.loads(row.session_data)
|
session_data = pickle.loads(row.session_data)
|
||||||
self.update(session_data)
|
self.update(session_data)
|
||||||
response.session_new = False
|
response.session_new = False
|
||||||
else:
|
else:
|
||||||
@@ -925,7 +928,7 @@ class Session(Storage):
|
|||||||
response.cookies[response.session_id_name]['expires'] = \
|
response.cookies[response.session_id_name]['expires'] = \
|
||||||
cookie_expires.strftime(FMT)
|
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()
|
response.session_hash = hashlib.md5(session_pickled).hexdigest()
|
||||||
|
|
||||||
if self.flash:
|
if self.flash:
|
||||||
@@ -1084,7 +1087,7 @@ class Session(Storage):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def _unchanged(self, response):
|
def _unchanged(self, response):
|
||||||
session_pickled = cPickle.dumps(self)
|
session_pickled = pickle.dumps(self, pickle.HIGHEST_PROTOCOL)
|
||||||
response.session_pickled = session_pickled
|
response.session_pickled = session_pickled
|
||||||
session_hash = hashlib.md5(session_pickled).hexdigest()
|
session_hash = hashlib.md5(session_pickled).hexdigest()
|
||||||
return response.session_hash == session_hash
|
return response.session_hash == session_hash
|
||||||
@@ -1111,7 +1114,7 @@ class Session(Storage):
|
|||||||
else:
|
else:
|
||||||
unique_key = response.session_db_unique_key
|
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,
|
dd = dict(locked=False,
|
||||||
client_ip=response.session_client,
|
client_ip=response.session_client,
|
||||||
@@ -1152,7 +1155,7 @@ class Session(Storage):
|
|||||||
portalocker.lock(response.session_file, portalocker.LOCK_EX)
|
portalocker.lock(response.session_file, portalocker.LOCK_EX)
|
||||||
response.session_locked = True
|
response.session_locked = True
|
||||||
if response.session_file:
|
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.write(session_pickled)
|
||||||
response.session_file.truncate()
|
response.session_file.truncate()
|
||||||
finally:
|
finally:
|
||||||
|
|||||||
Reference in New Issue
Block a user