2014-05-17 00:18:34 +08:00
|
|
|
"""
|
|
|
|
This custom Session model adds an extra column to store an account ID. In
|
|
|
|
real-world applications, it gives you the option of querying the database for
|
|
|
|
all active sessions for a particular account.
|
|
|
|
"""
|
|
|
|
from django.contrib.sessions.backends.db import SessionStore as DBStore
|
|
|
|
from django.contrib.sessions.base_session import AbstractBaseSession
|
|
|
|
from django.db import models
|
|
|
|
|
|
|
|
|
|
|
|
class CustomSession(AbstractBaseSession):
|
|
|
|
"""
|
|
|
|
A session model with a column for an account ID.
|
|
|
|
"""
|
|
|
|
account_id = models.IntegerField(null=True, db_index=True)
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def get_session_store_class(cls):
|
|
|
|
return SessionStore
|
|
|
|
|
|
|
|
|
|
|
|
class SessionStore(DBStore):
|
|
|
|
"""
|
|
|
|
A database session store, that handles updating the account ID column
|
|
|
|
inside the custom session model.
|
|
|
|
"""
|
|
|
|
@classmethod
|
|
|
|
def get_model_class(cls):
|
|
|
|
return CustomSession
|
|
|
|
|
|
|
|
def create_model_instance(self, data):
|
2017-01-21 21:13:44 +08:00
|
|
|
obj = super().create_model_instance(data)
|
2014-05-17 00:18:34 +08:00
|
|
|
|
|
|
|
try:
|
|
|
|
account_id = int(data.get('_auth_user_id'))
|
|
|
|
except (ValueError, TypeError):
|
|
|
|
account_id = None
|
|
|
|
obj.account_id = account_id
|
|
|
|
|
|
|
|
return obj
|
2019-05-20 04:15:45 +08:00
|
|
|
|
|
|
|
def get_session_cookie_age(self):
|
|
|
|
return 60 * 60 * 24 # One day.
|