You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cached_db.py 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """
  2. Cached, database-backed sessions.
  3. """
  4. from django.conf import settings
  5. from django.contrib.sessions.backends.db import SessionStore as DBStore
  6. from django.core.cache import caches
  7. KEY_PREFIX = "django.contrib.sessions.cached_db"
  8. class SessionStore(DBStore):
  9. """
  10. Implement cached, database backed sessions.
  11. """
  12. cache_key_prefix = KEY_PREFIX
  13. def __init__(self, session_key=None):
  14. self._cache = caches[settings.SESSION_CACHE_ALIAS]
  15. super().__init__(session_key)
  16. @property
  17. def cache_key(self):
  18. return self.cache_key_prefix + self._get_or_create_session_key()
  19. def load(self):
  20. try:
  21. data = self._cache.get(self.cache_key)
  22. except Exception:
  23. # Some backends (e.g. memcache) raise an exception on invalid
  24. # cache keys. If this happens, reset the session. See #17810.
  25. data = None
  26. if data is None:
  27. s = self._get_session_from_db()
  28. if s:
  29. data = self.decode(s.session_data)
  30. self._cache.set(self.cache_key, data, self.get_expiry_age(expiry=s.expire_date))
  31. else:
  32. data = {}
  33. return data
  34. def exists(self, session_key):
  35. return session_key and (self.cache_key_prefix + session_key) in self._cache or super().exists(session_key)
  36. def save(self, must_create=False):
  37. super().save(must_create)
  38. self._cache.set(self.cache_key, self._session, self.get_expiry_age())
  39. def delete(self, session_key=None):
  40. super().delete(session_key)
  41. if session_key is None:
  42. if self.session_key is None:
  43. return
  44. session_key = self.session_key
  45. self._cache.delete(self.cache_key_prefix + session_key)
  46. def flush(self):
  47. """
  48. Remove the current session data from the database and regenerate the
  49. key.
  50. """
  51. self.clear()
  52. self.delete(self.session_key)
  53. self._session_key = None