我正在尝试部署模拟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在brew services
本地运行的AWS RDS和redis服务器上远程运行时,一切正常。但是,如果我docker-compose up
容器,django的会话处理似乎会中断。
我的docker-compose如下:(请注意,由于我打算使用AWS RDS和Elasticache,因此我没有在撰写文件中包含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"
我可以毫无问题地登录admin,所以它肯定与使用redis作为会话后端有关,并且可能是由于Django docker容器无法访问redis。
非常感谢您的帮助!我已经整整工作了两天来解决这个问题,现在我的老板为此欺负我。 :(
答案 0 :(得分:1)
我也将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",