mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +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)
 |