title: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
body: <p>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.</p>
  
  <pre><code>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 &lt;type 'function'&gt;: attribute lookup __builtin__.function failed
  </code></pre>
  
  <p>I've tried the answer to this:</p>
  
  <p><a href="https://stackoverflow.com/questions/569754/how-to-tell-for-which-object-attribute-pickle-fails">How to tell for which object attribute pickle fails?</a></p>
  
  <p>by adding self to the actual error to see if that would print anything in the Django error to no avail.</p>
  
  <p>Where can I print out the object that is giving issues from this error so that it will appear in the Django error page?</p>
  
  <p>Thanks!
  ~Matt</p>
  
  <p>EDIT: The only object I'm storing in the cache, is a user object with the code:</p>
  
  <pre><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
  </code></pre>
  
  <p>EDIT: WSGI file after Werkzeug:</p>
  
  <pre><code>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)
  </code></pre>