2012-02-22 82 views
6

我想用一些登錄用戶創建一個Django應用程序。另一方面,因爲我想要一些實時功能,所以我想使用Express.js應用程序。在Redis上共享一個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應用程序。

那麼,這是一個好主意嗎?沒有任何問題嗎?特別是關於密鑰,我不確定他們是否會共享相同的會話。

+0

您絕對需要爲express或django編寫自定義處理程序,同步它們如何編碼cookie,如何將cookie中的會話標識符映射到redis鍵以及如何將redis值映射到會話。 – 2012-02-22 12:50:59

+0

嘿,所以沒有辦法讓它開箱即用?我希望有人對這兩種系統都有同感(也許你有,我不知道:))。 – 2012-02-22 13:04:18

+1

當然,你不必信任我。我從未與django-redis會話合作過。但是我在Express和Django上工作過很多。但是這並不是那裏,因爲Express會話是JSON,而Django會話是Python對象。所以這是行不通的。 Express會將會話存儲爲'sess:sessionId',並不是瘋狂的猜測,django-redis-session使用其他一些方案在redis鍵和會話ID之間進行映射。 – 2012-02-22 13:10:57

回答

3

您將不得不爲Express或Django編寫自定義會話存儲。 Django默認(以及在django-redis-sessions中)將會話存儲爲pickled Python對象。將商店會話作爲JSON字符串快速存儲Express和connect-redis以redis的密鑰sess:sessionId存儲會話,而Django(不完全確定這一點)似乎將它們存儲在密鑰sessionId下。您可以使用django-redis-sessions作爲基礎,並覆蓋encode,decode,_get_session_key,_set_session_key以及其他幾個。您還必須確保Cookie以相同的方式存儲和加密。

很明顯,爲Express創建一個會話存儲區可能會困難得多,可以清理和取消Python對象。

+0

非常感謝! :) – 2012-02-22 13:29:30

+2

實際上,你可以從Django 1.5.3開始以JSON格式序列化Django會話。請參閱https://docs.djangoproject.com/en/1.5/topics/http/sessions/#session-serialization – Druska 2013-08-28 22:34:17

相關問題