With pickle protocol v1, you cannot pickle open file objects, network connections, or database connections.
Pickle in Python is primarily used in serializing and deserializing a Python object structure. In other words, it's the process of converting a Python object into a byte stream to store it in a file/database, maintain program state across sessions, or transport data over the network.
multiprocessing is a package that supports spawning processes using an API similar to the threading module. The multiprocessing package offers both local and remote concurrency, effectively side-stepping the Global Interpreter Lock by using subprocesses instead of threads.
I'm receiving this error in my Django application, however, it only happens once a day or less and it's proving extremely difficult to debug.
Environment:
Request Method: POST
Django Version: 1.3.1
Python Version: 2.6.6
Installed Applications:
['django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'fimedlabs',
'data',
'djcelery']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'fimedlabs.auth.userMiddleWare')
Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
178. response = middleware_method(request, response)
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/middleware.py" in process_response
36. request.session.save()
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/backends/db.py" in save
57. session_data = self.encode(self._get_session(no_load=must_create)),
File "/usr/local/lib/python2.6/dist-packages/django/contrib/sessions/backends/base.py" in encode
93. pickled = pickle.dumps(session_dict, pickle.HIGHEST_PROTOCOL)
Exception Type: PicklingError at /
Exception Value: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
I've tried the answer to this:
How to tell for which object attribute pickle fails?
by adding self to the actual error to see if that would print anything in the Django error to no avail.
Where can I print out the object that is giving issues from this error so that it will appear in the Django error page?
Thanks! ~Matt
EDIT: The only object I'm storing in the cache, is a user object with the code:
class user(object):
username = str()
userid = uuid.UUID(int=0)
client = models.Client()
clientid = uuid.UUID(int=0)
clientname = ''
data = models.User()
accesslevel = models.AccessLevel()
active = False
client_active = False
isFimed = False
isFimedAdmin = False
isClientAdmin = False
isFimedManager = False
mysettingsform = None
viewingas = False
menu = []
_exists = False
_authenticated = False
def __str__(self):
return str(self.__dict__.copy())
def __getstate__(self):
return self.__dict__.copy()
def __setstate__(self, dict):
self.__dict__ = dict
def __init__(self, username=None):
if username:
self.initialize(username)
def initialize(self, username):
self.username = username
model = models.User.objects.filter(username=username).all()
if len(model) == 1:
model = model[0]
self.data = model
self._exists = True
self.userid = self.data.id
self.active = self.data.active
self.isFimed = self.data.isFimed()
self.isFimedAdmin = self.data.isFimedAdmin()
self.isClientAdmin = self.data.isClientAdmin()
self.isFimedManager = self.data.isFimedManager()
self.mysettingsform = UserFormSelf(initial={"id":model.id, "username":model.username, "name":model.name, "email":model.email, "phone":model.phone})
self.accesslevel = models.AccessLevel.objects.filter(id=self.data.accesslevel_id)[:1][0].level
cli = self.data.client
self.client = cli
self.clientid = cli.id
self.clientname = cli.name
if cli.active:
self.client_active = True
model.lastlogin = datetime.datetime.now()
model.save()
self.menu = getMenu(self.data)
else:
self._exists = False
def authenticate(self, password):
self._authenticated = False
if (self.active == False or self.client_active == False):
return False
if self._exists:
import hashlib
hash = hashlib.md5('%s%s' % (str(password), self.data.pwsalt)).hexdigest()
if hash == self.data.pwhash:
self._authenticated = True
return True
return False
def updateUser(self):
self.initialize(models.User.objects.filter(id=self.userid).get().username)
def mkContext(self):
c = Context()
c['menu'] = self.menu
c['user'] = self
c['language'] = language
c['colors'] = colors
c["isFimed"] = self.isFimed
c["isFimedAdmin"] = self.isFimedAdmin
c["isClientAdmin"] = self.isClientAdmin
c["isFimedManager"] = self.isFimedManager
c["mysettingsform"] = self.mysettingsform
return c
EDIT: WSGI file after Werkzeug:
import django.core.handlers.wsgi
djangoapplication = django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
if 'SCRIPT_NAME' in environ:
del environ['SCRIPT_NAME']
return djangoapplication(environ, start_response)
# The following lines enable the werkzeug debugger
import django.views.debug
def null_technical_500_response(request, exc_type, exc_value, tb):
raise exc_type, exc_value, tb
django.views.debug.technical_500_response = null_technical_500_response
from werkzeug.debug import DebuggedApplication
application = DebuggedApplication(application, evalex=True)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With