mirror of
https://github.com/django/django.git
synced 2025-05-29 10:16:30 +00:00
Introduced an AbstractBaseSession model and hooks providing the option of overriding the model class used by the session store and the session store class used by the model.
52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
"""
|
|
This module allows importing AbstractBaseSession even
|
|
when django.contrib.sessions is not in INSTALLED_APPS.
|
|
"""
|
|
from __future__ import unicode_literals
|
|
|
|
from django.db import models
|
|
from django.utils.encoding import python_2_unicode_compatible
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
|
class BaseSessionManager(models.Manager):
|
|
def encode(self, session_dict):
|
|
"""
|
|
Return the given session dictionary serialized and encoded as a string.
|
|
"""
|
|
session_store_class = self.model.get_session_store_class()
|
|
return session_store_class().encode(session_dict)
|
|
|
|
def save(self, session_key, session_dict, expire_date):
|
|
s = self.model(session_key, self.encode(session_dict), expire_date)
|
|
if session_dict:
|
|
s.save()
|
|
else:
|
|
s.delete() # Clear sessions with no data.
|
|
return s
|
|
|
|
|
|
@python_2_unicode_compatible
|
|
class AbstractBaseSession(models.Model):
|
|
session_key = models.CharField(_('session key'), max_length=40, primary_key=True)
|
|
session_data = models.TextField(_('session data'))
|
|
expire_date = models.DateTimeField(_('expire date'), db_index=True)
|
|
|
|
objects = BaseSessionManager()
|
|
|
|
class Meta:
|
|
abstract = True
|
|
verbose_name = _('session')
|
|
verbose_name_plural = _('sessions')
|
|
|
|
def __str__(self):
|
|
return self.session_key
|
|
|
|
@classmethod
|
|
def get_session_store_class(cls):
|
|
raise NotImplementedError
|
|
|
|
def get_decoded(self):
|
|
session_store_class = self.get_session_store_class()
|
|
return session_store_class().decode(self.session_data)
|