我在Django中构建了一个带登录/注销的简单网站并部署到Heroku。我正在使用内置的Django auth用户。我已经确认,当用户登录时,他们会看到一个个人资料页面,一旦刷新,他们仍然会登录。
当我将Heroku dynos的数量增加到1以上时,会话不再持久。我的意思是,用户登录后,刷新一两次后,用户就会注销。我相信这是因为每个请求都转到一个特定的dyno,每个dyno都保持隔离的会话状态?显然,当会话仅在用户碰巧从正确的dyno请求时,我的网站才能运行。
为了尝试解决这个问题并允许我的Django应用程序使用多个dyno,我使用django-redis-sessions认为所有dynos都可以共享对存储会话信息的单个Redis群集的访问权限。当我重新尝试将dyno计数提高到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 :(得分:0)
Django会话持久存储在数据库中。 Dynos不应该以任何方式影响他们。
答案 1 :(得分:0)
您是为每个应用程序dyno创建一个不同的redis插件,还是将相同的附加到所有dyno?您需要后者共享会话!
还请注意,默认情况下,redis连接不受保护。我不确定会话是否已使用应用程序SECRET_KEY加密,或者如果有人获得REDIS_URL,它们是否可被利用。