1

我已经在 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 的使用情况,验证我是否仍然有问题,并报告回来。

4

2 回答 2

0

Django 会话保存在数据库中。测功机不应该以任何方式影响它们。

于 2013-02-07T11:24:04.083 回答
0

您是为每个应用程序 dyno 创建不同的 redis 插件,还是将同一个插件附加到所有 dyno?您将需要后者来共享会话!

另请注意,默认情况下,redis 连接是不安全的。我不确定会话是否使用 SECRET_KEY 应用程序加密,或者如果有人获得 REDIS_URL,它们是否可被利用。

于 2020-05-25T15:29:35.270 回答