2016-11-30 100 views
1

我目前正在运行Django应用程序,SESSION_ENGINE配置为user_sessions.backends.db(我正在使用this外部库)。 Django自己的内置会话非常棒,但所有数据都隐藏在base64编码数据中。这个库使会话对象像其他ORM对象一样可访问。将会话数据从自定义后端迁移到后端缓存(Django)

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

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

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

这听起来是对的吗?因为这是一个相当复杂的任务,所以在这个时候,我会很乐意知道任何不该做的事情。提前致谢。

+0

下面是我该怎么做:弄清楚如何将当前会话数据序列化到Django的会话数据中。查看您是否可以将当前会话ID直接映射到Django会话框架使用的密钥。将所有会话数据迁移到新的会话存储。编写一个中间件,将旧会话引擎的Cookie密钥转换为新密码,使其对Django的会话引擎透明。 (如果无法重新使用密钥,请将地图old_key => new_key写入Django的缓存并进行查询)。 – Tiago

回答

0

在我看来,最好的方法是将所有当前会话数据迁移到本地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默认值和它应该管用。