2010-09-13 43 views
4

我在Django中使用會話來存儲登錄用戶信息以及一些其他信息。我一直在閱讀Django會話網站,仍然有幾個問題。在Django中使用會話

從Django的網站:

默認情況下,在 數據庫的Django存儲會話(使用模型 django.contrib.sessions.models.Session)。 儘管這很方便,但在某些 設置中,將會話 數據存儲在別處會更快,因此Django可以配置爲 ,將會話數據存儲在文件系統的 或緩存中。

另外:

對於持久性,緩存數據,設置 SESSION_ENGINEdjango.contrib.sessions.backends.cached_db。 這將使用直寫式高速緩存 - 每次寫入高速緩存也將 寫入數據庫。如果數據尚不在緩存中,則會話讀取 僅使用數據庫 。

是否有一個很好的經驗規則使用哪一個? cached_db似乎總是一個更好的選擇,因爲最好的情況下,數據在緩存中,最壞的情況是它在數據庫中,無論如何。一個缺點是我必須設置memcached。

默認情況下,SESSION_EXPIRE_AT_BROWSER_CLOSE設置 到False,這意味着會話cookie 將只要SESSION_COOKIE_AGE存儲在用戶的瀏覽器中 。使用 這個,如果你不希望人們有 每次打開瀏覽器 時間登錄。

是否有可能同時存在,會話在瀏覽器到期關閉並給一個年齡?

如果值爲整數,會話 將 活動的許多秒後到期。例如,撥打 request.session.set_expiry(300)將 使會話在5分鐘內過期。

什麼被認爲是 「不活動」?

如果您正在使用的數據庫後端,請注意,會話數據可以 積聚在django_session 數據庫表和Django不 提供自動清除。因此, 這是您的工作,定期清除過期的 會話。

這就是說,即使會話過期,我的數據庫中仍有記錄。在哪裏將代碼放在「清除數據庫」?我覺得你需要一個單獨的線程來每隔一段時間(每隔一小時?)通過數據庫並刪除任何過期的會話。

回答

4

是否有一個很好的經驗法則來使用?

Cached_db似乎將永遠是一個更好的選擇......

這很好。

在某些情況下,有許多Django(和Apache)進程查詢公用數據庫。 mod_wsgi以這種方式提供了很多可擴展性。緩存沒有多大幫助,因爲會話在Apache(和Django)進程中隨機分配。

是否有可能同時存在,會話在瀏覽器到期關閉並給出年齡?

不明白爲什麼不。

什麼被視爲「不活動」?

我假設你在開玩笑。 「活動」是 - 好 - 活動。你懂。在Django發生的東西。 Django可以看到的GET或POST請求。它還能是什麼?

在哪裏可以放置代碼來「清除數據庫」?

把它放在crontab或類似的東西。

我覺得你需要一個單獨的線程,只是經過分貝每過一段時間中(每隔一小時?)

忘記線程(請)。這是一個獨立的過程。一天一天很好。你認爲你會有多少次會話?

+0

對於一個有很多用戶的大網站,你可能會有很多會話?我不知道「crontab」是什麼,所以我一定會考慮一下。我還認爲「活動」可能意味着更新或訪問會話。 – JPC 2010-09-13 21:18:49

+1

@JPC:首先定義「大」和「批」。然後找出多少次會話。他們不是一個巨大的數據庫負擔。 「訪問會話」中的「活動」與Django處理的任何GET/POST請求完全相同 - 還有什麼意思? – 2010-09-13 21:34:04