TypeError int() 参数必须是字符串、类似字节的对象或数字,而不是“NoneType”

问题描述 投票:0回答:1

我开始学习 DevOps,并在 AWS 上安装了这个小应用程序,它基本上只是检查与 rds 和 redis 的连接。但是redis没有获取端口、主机等设置。一开始我把变量放入ci.yml中,没有用。然后我尝试使用 .env 文件进行 docker-compose 并得到相同的结果。现在有点迷失,因为没有其他想法如何解决它。代码是正确的,因为它是由更有经验的朋友提供给我的。

问题出在 redis 变量上,即 $REDIS_PORT 和 $REDIS_HOST。日志:请求方法:GET请求URL:13.53.189.243:8001/test_connection文件“/usr/local/lib/python3.9/site-packages/redis/connection.py”,第1415行,在get_connection连接= self ._available_connections.pop() 异常类型:/test_connection/ 处的 TypeError 异常值:int()参数必须是字符串、类似字节的对象或数字,而不是“NoneType

问题是没有变量发送到redis,当我使用

docker exec -it backend_redis_container env | grep REDIS
命令时,我看到了所有变量,但是在连接时出现以下错误:

TypeError at /test_connection/ int() argument must be a string, a bytes-like object or a number, not 'NoneType
settings.py

ROOT_URLCONF = 'backend_redis.urls'
ROOT_HOSTCONF = 'backend_redis.hosts'
DEFAULT_HOST = 'default'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'backend_redis.wsgi.application'

# Redis settings
REDIS_HOST = os.environ.get('REDIS_HOST')
REDIS_PORT = os.environ.get('REDIS_PORT')
REDIS_DB = os.environ.get('REDIS_DB')
REDIS_PASSWORD = os.environ.get('REDIS_PASSWORD')
# Database
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
amazon-web-services docker devops
1个回答
0
投票

NoneType 意味着环境变量未定义,如果您也没有看到环境变量,则意味着您需要确保它们已正确设置。以下是根据您的设置执行此操作的方法:

  1. 使用docker-compose

确保您的 docker-compose.yml 包含以下内容:

env_file:
  - .env

并且 .env 文件内容应包含:

REDIS_HOST=your_redis_host
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=your_password_if_any
  1. 直接使用docker运行

如果您直接使用 docker 运行容器,则需要传递如下环境变量:

docker run -e REDIS_HOST=your_redis_host \
           -e REDIS_PORT=6379 \
           -e REDIS_DB=0 \
           -e REDIS_PASSWORD=your_password \
           your_django_image

就是这样。那么如果您应用任何先前的解决方案,则此命令

docker exec -it backend_redis_container env | grep REDIS

将为您列出 REDIS 变量。

您可以从redis设置和配置中获取所有这些变量,并确保您没有禁用REDIS的密码身份验证,否则您将只能使用IAM来访问它。

© www.soinside.com 2019 - 2024. All rights reserved.