I was talking about the _unlock call at the top of _try_store_on_disk def _try_store_on_disk(self, request, response): if not hasattr(os,'mkdir'): return if response._dbtable_and_field \ or not response.session_id \ or self._forget: self._unlock(response) return
The session.forget(response) would remove the attribute session_file if a del session_file occurs in _unlock() but self._forget being true will cause the _unlock to run again in the branch above and at the top of _unlock the if response and response.session_file would cause AttributeError. This piece of code is very intricate. :-)