我正在尝试部署模仿我的 django+postgresql(AWS RDS)+redis(AWS Elasticache) 的暂存环境。
我使用最新的 django-redis(4.10) 来设置 django 和 redis。我的设置如下:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
# Mimicing memcache behavior.
# http://niwinz.github.io/django-redis/latest/#_memcached_exceptions_behavior
"IGNORE_EXCEPTIONS": True,
},
}
}
# django-redis: use redis as session cache
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
当我在我的 pipenv 环境中本地运行它时,postgresql 在 AWS RDS 上远程运行,redis 服务器在本地运行brew services
,一切正常。但是如果我docker-compose up
是容器,django 的会话处理似乎会中断。
我的 docker-compose 如下:(请注意,因为我打算使用 AWS RDS 和 Elasticache,所以我没有在 compose 文件中包含 postgres 和 redis 容器)
version: '3.7'
services:
django: &django
restart: always
build:
context: .
dockerfile: ./compose/staging/django/Dockerfile # expose 8000
image: staging_django
container_name: staging_django
hostname: staging_django
networks:
- backend
env_file:
- ./.envs/.staging/.django
command: /start
nginx:
build:
context: .
dockerfile: ./compose/staging/nginx/Dockerfile
image: staging_nginx
container_name: staging_nginx
hostname: nginx
ports:
- "80:80"
networks:
- backend
restart: on-failure
links:
- django
depends_on:
- django
networks:
backend:
driver: 'bridge'
当我尝试登录管理站点时,django 容器返回以下错误。
staging_django | File "/usr/local/lib/python3.7/site-packages/django/contrib/sessions/backends/cache.py", line 51, in create
staging_django | "Unable to create a new session key. "
staging_django | RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.
我可以确认 django 没有访问 redis 服务器,因为 redis-cli 的 MONITOR 没有显示任何与 django 相关的日志。
如果我把上面settings.py中的两行注释掉,
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
我可以登录管理员没有问题,所以它肯定与使用 redis 作为会话后端有关,并且可能是由于无法从 django docker 容器访问 redis。
非常感谢任何帮助!我已经工作了整整两天来解决这个问题,现在我的老板正在为此欺负我。:(