【发布时间】:2017-01-30 01:27:34
【问题描述】:
我计划通过添加 account_id 来扩展默认 sessionstore,为此我点击了此链接 extending-database-backed-session-engines,但在迁移时未创建 account_id。
应用程序位于app 文件夹中。
在 ./settings.py 中。我有:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.messages',
'django.contrib.staticfiles',
'app'
)
根据这个链接Extending the Session Middleware我有:
SESSION_ENGINE='app.sessions'
在 ./sessions.py 中。我有:
from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.contrib.sessions.base_session import AbstractBaseSession
from django.db import models
class SessionStore(DBStore):
@classmethod
def get_model_class(cls):
return CustomSession
def create_model_instance(self, data):
obj = super(SessionStore, self).create_model_instance(data)
try:
account_id = int(data.get('_auth_user_id'))
except (ValueError, TypeError):
account_id = None
obj.account_id = account_id
return obj
class CustomSession(AbstractBaseSession):
account_id = models.IntegerField(null=True, db_index=True)
class Meta:
app_label = 'sessions'
@classmethod
def get_session_store_class(cls):
return SessionStore
编辑:使用此配置不会创建会话表。
我还尝试在sessions 模块中添加sessions.py 文件,并将app.sessions 添加到settings 中的installed_apps 部分,结果相同。
我是否还需要修改迁移文件来创建会话表?
解决方案
我已经解决了这个问题。解决办法是:
-
将
INSTALLED_APPS改成settings.py如下:INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.messages', 'django.contrib.staticfiles', 'app' ] -
在`settings.py中修改
SESSION_ENGINE如下:SESSION_ENGINE='app.sessions' -
在
./app/sessions.py,我有:from django.contrib.sessions.backends.db import SessionStore as DBStore import app class SessionStore(DBStore): @classmethod def get_model_class(cls): return app.models.models.CustomSession def create_model_instance(self, data): obj = super(SessionStore, self).create_model_instance(data) try: user_id = int(data.get('_auth_user_id')) except (ValueError, TypeError): user_id = None obj.user_id = user_id return obj -
在
./app/models/models.py,我有from django.contrib.auth.models import User from django.contrib.sessions.base_session import AbstractBaseSession from django.db import models from app.mysessions import SessionStore class CustomSession(AbstractBaseSession): user_id = models.IntegerField(null=True, db_index=True) class Meta: app_label = 'app' @classmethod def get_session_store_class(cls): return SessionStore 定期进行迁移和迁移。一切都应该运行。
【问题讨论】: