我计划通过添加 account_id 来扩展默认 session 存储,为此我点击了此链接 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
编辑:使用此配置,不会创建 session 表。
我还尝试在 sessions
模块中添加 sessions.py
文件,并将 app.sessions
添加到
部分,结果相同。settings
中的 >installed_apps
我还需要修改迁移文件来创建 session 表吗?
解决方案
我已经解决了这个问题。解决办法是:
在
settings.py
中更改INSTALLED_APPS
,如下所示: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
定期进行迁移和迁移。一切都应该正在运行。
最佳答案
如果您有一个具有自定义 session 模型的应用,则应将其包含在您的 INSTALLED_APPS
中,而不是 django.contrib.sessions
中。
有
SESSION_ENGINE='app.sessions'
我觉得不对。 SESSION_ENGINE
应该是您的 AbstractBaseSession
子类的路径。
关于python - 扩展数据库支持的 session 引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34678211/