【问题标题】:Sharing a session store on Redis for a Django and a Express.js Application在 Redis 上为 Django 和 Express.js 应用程序共享会话存储
【发布时间】:2012-03-12 13:45:10
【问题描述】:

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

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

我认为使用 Redis 是个好主意,因为 volatile 键非常适合这种情况,而且我已经在应用程序的另一部分使用了 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 应用程序。

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

【问题讨论】:

  • 您肯定必须为 express 或 django 编写一个自定义处理程序,以同步它们如何编码 cookie,它们如何将 cookie 中的会话标识符映射到 redis 键,以及它们如何映射一个会话的 redis 值。
  • 嘿,所以没有办法让它开箱即用?我想听听曾经使用过这两种系统的人的意见(也许你有,我不知道:))。
  • 当然,你不必相信我。我从未使用过 django-redis-session。但我在 Express 和 Django 方面做了很多工作。但这既不是这里也不是那里,因为 Express 会话是 JSON 是事实,而 Django 会话是腌制的 Python 对象。所以这行不通。 Express 将会话存储为sess:sessionId,并且可以猜测 django-redis-session 使用其他方案在 redis 键和会话 ID 之间进行映射。
  • 好吧,这就是我所期望的答案(解释为什么它不起作用)。如果您将此添加为答案,我会给您。 :)

标签: python django node.js redis express


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 2018-05-22
  • 2016-09-10
  • 2016-12-29
  • 1970-01-01
  • 2019-09-27
  • 2015-04-24
  • 2011-03-13
  • 2016-07-16
  • 2013-02-15
相关资源
最近更新 更多