0

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

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

4

1 回答 1

1

我也会把redis放进去docker-compose.yml

然后在您的 django 设置文件中,使用 redis 的服务名称,如下所示:

码头工人-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

设置.py

"LOCATION": "redis://session_caching:6379/1",
于 2019-07-19T08:35:21.973 回答