我计划通过添加account_id来扩展默认会话库,为此,我按照此链接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.py
模块中添加sessions
文件,并将app.sessions
添加到installed_apps
中的settings
部分,同样结果
我是否还需要修改迁移文件以创建会话表?
我已经解决了这个问题。解决方案是:
更改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
定期makemigrations和迁移。所有人都应该跑步。
答案 0 :(得分:2)
如果您的应用具有自定义会话模型,则应将其包含在INSTALLED_APPS
而不是django.contrib.sessions
中。
具有
SESSION_ENGINE='app.sessions'
对我来说不对。 SESSION_ENGINE
应该是AbstractBaseSession
子类的路径。