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

时间:2012-02-22 08:19:03

标签: python django node.js redis 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
  }
}))
[...]

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

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

1 个答案:

答案 0 :(得分:3)

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

显然,为Express创建一个可以腌制和取消Python对象的会话存储会更加困难。