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. :-)