Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
django/django/contrib/sessions/backends/cached_db.py
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
72 lines (59 sloc)
2.05 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Cached, database-backed sessions. | |
""" | |
from django.conf import settings | |
from django.contrib.sessions.backends.db import SessionStore as DBStore | |
from django.core.cache import caches | |
KEY_PREFIX = "django.contrib.sessions.cached_db" | |
class SessionStore(DBStore): | |
""" | |
Implement cached, database backed sessions. | |
""" | |
cache_key_prefix = KEY_PREFIX | |
def __init__(self, session_key=None): | |
self._cache = caches[settings.SESSION_CACHE_ALIAS] | |
super().__init__(session_key) | |
@property | |
def cache_key(self): | |
return self.cache_key_prefix + self._get_or_create_session_key() | |
def load(self): | |
try: | |
data = self._cache.get(self.cache_key) | |
except Exception: | |
# Some backends (e.g. memcache) raise an exception on invalid | |
# cache keys. If this happens, reset the session. See #17810. | |
data = None | |
if data is None: | |
s = self._get_session_from_db() | |
if s: | |
data = self.decode(s.session_data) | |
self._cache.set( | |
self.cache_key, data, self.get_expiry_age(expiry=s.expire_date) | |
) | |
else: | |
data = {} | |
return data | |
def exists(self, session_key): | |
return ( | |
session_key | |
and (self.cache_key_prefix + session_key) in self._cache | |
or super().exists(session_key) | |
) | |
def save(self, must_create=False): | |
super().save(must_create) | |
self._cache.set(self.cache_key, self._session, self.get_expiry_age()) | |
def delete(self, session_key=None): | |
super().delete(session_key) | |
if session_key is None: | |
if self.session_key is None: | |
return | |
session_key = self.session_key | |
self._cache.delete(self.cache_key_prefix + session_key) | |
def flush(self): | |
""" | |
Remove the current session data from the database and regenerate the | |
key. | |
""" | |
self.clear() | |
self.delete(self.session_key) | |
self._session_key = None |