2013-02-06 104 views
1

我已經建立了一個簡單的網站,在Django中登錄/註銷並部署到Heroku。我正在使用內置的Django auth用戶。我已經驗證,當用戶登錄時,他們會看到一個配置文件頁面,並在刷新後仍保持登錄狀態。Django會話與多個Heroku Dynos

當我將Heroku dynos的數量增加到1以上時,會話不再持久。我的意思是,用戶登錄後,刷新或兩次後,用戶註銷。我相信這是因爲每個請求都會發送到一個特定的測試儀,每個測試儀都獨立維護會話狀態?很顯然我的網站不能在會話只有在用戶碰巧從正確的測試儀請求時纔有效。

爲了解決這個問題,並允許我的Django應用程序使用多個dyno,我使用django-redis-sessions認爲所有的dynos都可以共享對存儲會話信息的單個Redis集羣的訪問。當我重試將測試計數提高到1以上時,即使會話正在寫入Redis羣集,問題也會立即返回。

我錯過了什麼嗎?這是我第一次嘗試在Heroku上擴展Django。謝謝!

我製作設置一些相關的章節:

INSTALLED_APPS = (
    'django.contrib.auth',   # User Authentication App 
    'django.contrib.contenttypes', # Dependency of auth 
    'django.contrib.sessions',  # Database backed sessions 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', # Collect and store static resources 
    'storages',      # Custom Django Storage Backends 
    'djcelery',      # Celery Queueing 
    'kombu.transport.django',  # Use database as a Celery queue 
    'app_pkg.apps.web', 
) 

SESSION_ENGINE = 'redis_sessions.session' 

SESSION_REDIS_HOST = 'servername.redistogo.com' 
SESSION_REDIS_PORT = 9357 
SESSION_REDIS_DB = 0 
SESSION_REDIS_PASSWORD = 'mypassword' 
SESSION_REDIS_PREFIX = 'session' 

編輯: 我所集成的Redis到我的應用程序以前出現過此問題。我開始使用Redis會話存儲作爲集中存儲會話的位置的一種方式,而沒有意識到數據庫已經這樣做了。如果它的任何用途,正在使用的數據庫是通過Heroku插件的Amazon RDS。我將分析Redis的使用情況,確認我仍然遇到問題,然後再報告。

+0

會話基於cookie值和*數據庫*默認情況下,甚至沒有意識到heroku dyno。它只是在數據庫中查找會話Cookie ID。您應該確認Cookie保持一致。你也可以看看數據庫調用(調試模式吐出SQL),看看它在做什麼。 –

+0

我認爲你的上面的代碼應該可以工作......你可以在會話中存儲其他東西嗎?當你改變dynos時他們也被遺忘了嗎?這將有助於將其歸結爲redis配置或身份驗證。 – peterw

+0

正如我在編輯中提到的,我認爲這個問題與redis配置無關,因爲在將Redis集成到我的應用程序之前,問題已經存在。我會盡快做進一步的測試並回報。 – fractalous

回答

0

Django會話在數據庫中保存。 Dynos不應以任何方式影響它們。

+0

我認爲這裏的一個關鍵行是'SESSION_ENGINE'設置,他們將它從數據庫存儲更改爲redis存儲。驗證模塊的工作方式是否有所不同? – peterw