【问题标题】:Migrating session data from custom backend to cache backend (Django)将会话数据从自定义后端迁移到缓存后端 (Django)
【发布时间】:2017-04-14 12:09:12
【问题描述】:

我目前正在运行一个 SESSION_ENGINE 配置为 user_sessions.backends.db 的 Django 应用程序(我正在使用 this 外部库)。 Django 自己的内置会话很棒,但是所有数据都隐藏在 base64 编码数据中。该库使会话对象可以像其他 ORM 对象一样访问。

我需要移除对这个库的依赖;将 SESSION ENGINE 更改为缓存以提高性能。

我的挑战是在不破坏当前会话数据的情况下进行此更改,这就是这个问题的意义所在。鉴于其性质,该库自然不包含 db 以外的后端,因此我必须对其进行扩展。

我应该如何解决这个问题?例如,在我的脑海中:i)我应该查看这个库保存会话数据的 db 表的内容,ii)在每次写入时将这些数据保存到缓存内存的写入功能,iii)转移到读取来自缓存(使用 db 作为后备)。

这听起来对吗?很想知道此时有什么不该做的,因为这是一项相当复杂的任务。提前致谢。

【问题讨论】:

  • 我会这样做:弄清楚如何将当前会话数据序列化为 Django 的会话数据。看看是否可以将当前会话 ID 直接映射到 Django 会话框架使用的键。将所有会话数据迁移到新的会话存储。编写一个中间件,将旧会话引擎的 cookie key 转换为新的,使其对 Django 的会话引擎透明。 (如果无法重复使用密钥,请将映射 old_key => new_key 写入 Django 的缓存并查询)。

标签: django session django-sessions


【解决方案1】:

在我看来,最好的方法是将所有当前会话数据迁移到本机 Django 会话框架,只需重新序列化所有会话数据,保持相同的会话 ID。

首先,我要弄清楚 Session 框架是如何序列化数据的。例如,在 Django 1.10.4 上,here's what you should be looking for: django/contrib/sessions/backends/base.py#L96

然后,我会编写一个转换器,从数据库中读取当前会话数据并将其转换为本地数据。

我不确定会话 ID 是如何工作的,但看起来它们使用相同类型的 id,所以应该可以这样做,然后将 SESSION_ENGINEMIDDLEWARE_CLASSES 更改回 Django默认值,它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2012-08-16
    相关资源
    最近更新 更多