python - 扩展数据库支持的 session 引擎

标签 python django session

我计划通过添加 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 表吗?

解决方案

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

  1. settings.py 中更改 INSTALLED_APPS,如下所示:

    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. 定期进行迁移和迁移。一切都应该正在运行。

最佳答案

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

SESSION_ENGINE='app.sessions'

我觉得不对。 SESSION_ENGINE 应该是您的 AbstractBaseSession 子类的路径。

关于python - 扩展数据库支持的 session 引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34678211/

相关文章:

asp.net-mvc-3 - 从 ajax 调用中注销

python - 如何在 Django 中为对象使用临时存储?

php - PHP session 的安全性

python - 具有冗余重叠的排列? Python

python - 将文件从一个 s3 存储桶复制到另一个存储桶的最简单的 lambda 函数

python - Django的模板语言不能安全的处理dict

python - Django 休息总是创建新实例

javascript - 我应该如何管理 Hapijs 中的 session ?

python - Django:将 .py 文件移动到文件夹中进行整理

python - 生成 3 个总和为 n 的数字