Третья строка SessionMiddleware вызывает конкретный механизм сессии , который указывает, какой SessionStore использовать.
Если вы зайдете в contrib / session / backends / base.py, вы увидите следующий код:
class SessionBase(object):
...
def __getitem__(self, key):
return self._session[key]
def _get_session(self, no_load=False):
"""
Lazily loads session from storage (unless "no_load" is True, when only
an empty dict is stored) and stores it in the current instance.
"""
self.accessed = True
try:
return self._session_cache
except AttributeError:
if self._session_key is None or no_load:
self._session_cache = {}
else:
self._session_cache = self.load()
return self._session_cache
_session = property(_get_session)
Это создает объект сеанса proxy , который промежуточное программное обеспечение прикрепило к запросу. Он не загружает объект сеанса из базы данных, пока вы не скажете:
x = request.session['key']
В этот момент __getitem__(self, key)
пытается разыменовать self._session
, который (будучи свойством), в свою очередь, возвращает кэшированную копию словаря сеанса для этой транзакции, или, если кэш-память недоступна, извлекает ее из хранилища используя метод load()
. Метод load()
реализуется определенными дочерними механизмами: база данных, файл, кэш, кэш + БД и т. Д.
SessionStore
- облегченный прокси для полного сеанса; он становится полным сеансом, попадающим в базу данных, когда вам нужно прочитать или записать данные в объект сеанса, связанный с ключом, закодированным в файле cookie идентификатора сеанса.