将Redis用作会话后端时,Django Docker容器无法访问Redis容器

时间:2019-07-19 08:27:44

标签: django docker redis django-redis session-cache

我正在尝试部署模拟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。

非常感谢您的帮助!我已经整整工作了两天来解决这个问题,现在我的老板为此欺负我。 :(

1 个答案:

答案 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",