TIL-20210202

Celery 환경변수 가져오지 못하는 오류

터미널에서 celery -A project worker -l INFO 를 통해 celery를 실행시키면

```if settings_dict[‘HOST’].startswith(‘/’): AttributeError: ‘NoneType’ object has no attribute ‘startswith’


db관련해서 이런 에러가 발생했다.

celery에서 환경변수 값을 제대로 가져오지 못하는 것 같았다. 왜냐하면
sqlite3에서는 잘 동작했지만 환경변수를 통해 세팅한 mysql이 동작하지 않았기 때문이다.

```python
DATABASES = {
    # 에러발생
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ.get("DB_NAME"),
        'USER': os.environ.get("DB_USER"),
        'PASSWORD': os.environ.get("DB_PASSWORD"),
        'HOST': os.environ.get("DB_HOST"),
        'PORT': os.environ.get("DB_PORT"),
        'OPTIONS': {
            'charset': 'utf8mb4',
        },
    },
    # 정상적으로 동작
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

시도해본 것

celery.py에서 .env파일이 있는 경로에서 환경변수를 읽을 수 있도록 아래 코드를 추가 했지만 동일한 에러는 여전히 나타났다.

dotenv.read_dotenv('./.env')

해결

터미널에서 아래와 같이 직접 환경변수를 셋팅하니 잘 동작하였다. 그러나 매번 입력해줘야 한다는 단점이 있는데 이도 수정해야할 문제이다.

export DB_HOST=127.0.0.1
export DB_USER=
...

며칠 째 해결이 안되었는데 그나마 동작을 해서 기분이 좋았다. 매번 수동으로 터미널을 export를 통해 환경변수를 설정하지 않고 해결할 수 있는 방법을 찾아봐야겠다.

2021-02-05 드디어 해결!!

celery.py에 추가했던 dotenv.read_dotenv(‘./.env’) 코드를 settings.py에 추가하였더니 정상적으로 동작하였다.

생각해보니 당연한 결과였던것 같다.

로컬에서 python manage.py runserver를 했을 때 환경변수를 가져올 수 있었던 이유는 manage.py에 dotenv.read_dotenv(‘./.env’) 해당 코드가 들어가 있었고 배포된 서버에서도 잘 동작했던 이유는 wsgi.py에도 같은 코드가 있었기 때문이다.

celery.py에서는 settings.py의 코드를 가져오는데 settings.py에 정의된 os.environ.get(‘‘)와 같은 코드를 읽을 수 없기 때문에 에러가 발생한 것이다. 따라서 settings.py에서도 환경변수를 가져오는 코드를 추가해주면 정상적으로 동작한다.

알고보면 간단한 문제를 며칠째 해결못하고 있었는데.. 늦게라도 해결되어 다행이다.

태그:

카테고리:

업데이트:

댓글남기기