我已经在 Django 中构建了一个带有登录/注销的简单网站并部署到 Heroku。我正在使用内置的 Django 身份验证用户。我已经验证,当用户登录时,他们会看到一个个人资料页面,并且在刷新后他们仍然保持登录状态。
当我将 Heroku dynos 的数量增加到 1 个以上时,会话不再持续。我的意思是,在用户登录后,刷新一两次后,用户就退出了。我相信这是因为每个请求都转到一个特定的测功机,每个请求都单独维护会话状态?显然,当会话仅在用户碰巧从正确的测功机请求时才有效时,我的网站无法运行。
为了尝试解决这个问题并允许我的 Django 应用程序使用多个 dyno,我使用django-redis-sessions认为所有 dyno 都可以共享对存储会话信息的单个 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 的使用情况,验证我是否仍然有问题,并报告回来。