在Redis上为Django和Express.js应用程序共享会话存储

Flo*_*ine 7 python django redis node.js express

我想创建一个带有一些登录用户的Django应用程序.另一方面,由于我需要一些实时功能,我想使用Express.js应用程序.

现在,问题是,我不希望未经验证的用户访问Express.js应用程序的数据.所以我必须在Express.js和Django应用程序之间共享一个会话存储.

我认为使用Redis会是一个好主意,因为易失性键非常适合这种情况,我已经将Redis用于应用程序的另一部分.

在Express.js应用程序上,我有这样的代码:

[...]
this.sessionStore = new RedisStore;
this.use(express.session({
  // Private crypting key
  secret: 'keyboard cat', // I'm worried about this for session sharing
  store: this.sessionStore,
  cookie: {
    maxAge: 1800000
  }
}))
[...]
Run Code Online (Sandbox Code Playgroud)

在Django方面,我想到使用django-redis-session应用程序.

那么,这是个好主意吗?不会有任何问题吗?特别是关于秘密密钥,我不确定他们是否会共享相同的会话.

Lin*_*iel 3

您必须为 Express 或 Django 编写自定义会话存储。默认情况下,Django(以及 django-redis-sessions 中)将会话存储为 pickled Python 对象。Express 将会话存储为 JSON 字符串。Express 使用 connect-redis 将会话存储在 redis 的 key 下sess:sessionId,而 Django(对此不太确定)似乎将它们存储在 key 下sessionId。您也许可以使用 django-redis-sessions 作为基础,并覆盖encodedecode_get_session_key_set_session_key也许还有其他一些。您还必须确保 cookie 以相同的方式存储和加密。

显然,为 Express 创建一个可以 pickle 和 unpickle Python 对象的会话存储将会困难得多。

  • 实际上,从 Django 1.5.3 开始,您可以以 JSON 格式序列化 Django 会话。请参阅https://docs.djangoproject.com/en/1.5/topics/http/sessions/#session-serialization (2认同)