code: def load(self):
          
          session_data = {}
          try:
              session_text = crypt.decrypt(self.session_key,
                  passphrase=settings.DJAODJIN_SECRET_KEY,
                  debug_stmt="encrypted_cookies.SessionStore.load")
              session_data = json.loads(session_text)
              self._session_key_data.update(session_data)
              LOGGER.debug("session data (from proxy): %s", session_data)
              # We have been able to decode the session data, let's
              # create Users and session keys expected by Django
              # contrib.auth backend.
              if 'username' in session_data:
                  user = authenticate(
                      request=session_data, remote_user=session_data['username'])
                  if not user:
                      raise ValueError("Cannot authenticate user.")
                  session_data[SESSION_KEY] = user.id
                  session_data[BACKEND_SESSION_KEY] = user.backend
                  session_data[HASH_SESSION_KEY] = user.get_session_auth_hash()
                  if self._local:
                      session_data_local = self._local.load()
                      LOGGER.debug("session data (local): %s", session_data_local)
                      session_data.update(session_data_local)
          except (IndexError, TypeError, ValueError) as err:
              # Incorrect padding in b64decode, incorrect block size in AES,
              # incorrect PKCS#5 padding or malformed json will end-up here.
              LOGGER.debug("error: while loading session, %s", err)
              return {}
          return session_data
docs: We load the data from the key itself instead of fetching from
          some external data store. Opposite of _get_session_key(),
          raises BadSignature if signature fails.
  
            $ echo '_json_formatted_' | openssl aes-256-cbc -a -k _passphrase_ -p
            salt=...
            key=...
            iv=...
            _full_encrypted_