我计划通过添加一个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部分,结果相同。

我还需要修改迁移文件来创建Session表吗?



我已经解决了这个问题。解决方案是:


更改INSTALLED_APPSsettings.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

定期进行迁移和迁移。所有都应该运行。

最佳答案

如果您的应用程序具有自定义会话模型,则应在INSTALLED_APPS中而不是django.contrib.sessions中添加它。



SESSION_ENGINE='app.sessions'


在我看来是错的。 SESSION_ENGINE应该是AbstractBaseSession子类的路径。

09-04 07:10
查看更多