【问题标题】:Extending database-backed session engines扩展数据库支持的会话引擎
【发布时间】: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 部分,结果相同。

我是否还需要修改迁移文件来创建会话表?

解决方案

我已经解决了这个问题。解决办法是:

  1. INSTALLED_APPS改成settings.py如下:

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app'
    ]
    
  2. 在`settings.py中修改SESSION_ENGINE如下:

    SESSION_ENGINE='app.sessions'
    
  3. ./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
    
  4. ./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
    
  5. 定期进行迁移和迁移。一切都应该运行。

【问题讨论】:

    标签: python django session


    【解决方案1】:

    如果您的应用具有自定义会话模型,则应将其包含在您的 INSTALLED_APPS 中,而不是 django.contrib.sessions

    拥有

    SESSION_ENGINE='app.sessions'
    

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

    【讨论】:

    • 我是否在 INSTALLED_APPS 部分包含 app.sessions 而不是 django.contrib.sessions ?
    • 是的,如果您的应用位于app.sessions
    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2012-04-25
    相关资源
    最近更新 更多