我正在尝试部署模仿我的django+postgresql(AWS RDS)+redis(AWS Elasticache)的暂存环境。
我使用最新的 django-redis(4.10) 来使用 redis 设置 django。我的设置如下:
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-compos如下:(请注意,因为我打算使用AWS RDS和Elasticache,所以我没有在compos文件中包含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 的监视器没有显示任何与 django 相关的日志。
如果我注释掉上面 settings.py 中的两行,
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
我可以在后台登录没有问题,所以这绝对与使用 redis 作为会话后端有关,并且可能是由于无法从 django docker 容器访问 redis。
任何帮助真的非常感谢!我已经工作了整整两天来解决这个问题,现在我的老板为此欺负我。:(
我也会将redis放在docker-compose.yml
中。
然后在你的 django 设置文件中,使用 redis 的服务名称,如下所示:
docker-compose.yml
version: '3'
services:
web_app_server:
container_name: web_app_server
depends_on:
- session_caching
session_caching:
container_name: session_caching
image: redis:latest
restart: always
settings.py
"LOCATION": "redis://session_caching:6379/1",