본문 바로가기
개발일지/Django

Django - CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False. (해결)

by 개발에정착하고싶다 2023. 1. 23.

#1 개요

 

아.... 강의를 따라하는데, 중간에 한두개 빼먹은거를 간과했더니 역시나 작동이 안되었다.

음... 게임에서 죽었다고 생각하고 다시 시작하는 느낌으로 처음부터 다시 시작했다.

 

그러다보니 "프로젝트 단위"의 settings.py를

프로젝트 단위의 폴더 안에 "settings"라는 폴더를 만들어서

그 안에 common.py, dev.py, prod.py

이렇게 3개로 쪼개서 운용하는 방식을 알려주셨다.

 

common.py는 공용으로 쓰이는 settings

dev.py는 특히 추가적으로 개발에 쓰이는 settings

prod.py는 특히 배포시의 개발에 쓰이는 settings

이렇게 구분을 해주었다.

 

그러다보니 

 CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.

라는 에러가 떴다.

 

구글링을 해봐도 뭘 이상한걸 가지고 정답인양 말하는 정보이거나

아니면 돌고 돌아서 핵심을 짚지 못하는 정보가 많았기에 나의 상황에 맞는 해답을 적어보고자 한다.


#2 왜 그런걸까?

 

우선 사용용도에 따라 달라질 수 있겠지만 보편적으로는

장고 프로젝트를 생성하게되면 프로젝트 단위의 폴더와 manage.py

이렇게 2개의 파일이 생성된다.

 

manage.py는 보통 개발을 할때 쓰이고

프로젝트 단위의 폴더 안의 wsgi.py는 배포되었을때 활용된다.

 

만약 나의 경우처럼 기존의 settings.py를 쪼개줬거나 settings.py파일의 이름이 변경된다면 나와 같은 에러가 생성 될것이다.


#3 해결법

 

1. 첫번째 케이스

 

# manage.py

def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'askcompany.settings.dev')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)

이게 나의 manage.py 의 전체코드는 아니고 가장 기본적으로 들어있는 가장 처음에 나오는 정의 함수다.

여기에 보면

def main():에서 첫째줄이 주석, 두번째줄이 os부터 시작해서 )로 끝나는 영역이 있는데

보통 여기는

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<프로젝트이름>.settings')

이렇게 되어있을 것이다.

이 setdefault가 결국 settings.py를 읽어왔던 것이다.

나의 경우에는 프로젝트단위폴더/settings/dev.py

로 만들어주었기 때문에

프로젝트.settings.dev

가 되었던 것이다 (.py등의 확장자명은 생략)

그리고 manage.py 였던 만큼, dev로 가져와줬다

(의미부여는 개인의 취향에 따라 다를 수 있으니, melon.py로 정의했다면 프로젝트이름.settings.melon 이 된다.)


2. 두번째 케이스

 

두번째 케이스인 프로젝트 단위의 wsgi.py에 들어가도 초기 값이 몇가지 있을것이지만

그중에서도

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'askcompany.settings')

이렇게 첫번째 케이스와 마찬가지로 setdefault를 해준게 있을것이다.

첫번째 케이스와 마찬가지의 원리로 변형해준다.

나의 경우는

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'askcompany.settings.prod')

이렇게 되었다.


# 여담

 

혹~~ 시나 하는 마음에 딱 한가지 포인트만 짚고 넘어가겠다.

 

해결법에 보면 manage.py, wsgi.py의 setdefault 설정을 만져야 한다고 했는데

결과적으로 봤을때 프로젝트가 처음 생성이 되면 settings.py가 있었을것이다.

그리고 그걸 참조하기 위한 링크였으니 이상이 없었겠지만

위치를 바꿔줬든, 이름을 바꿔줬든, 둘다 바꿨든 한다면 분명 이 2개의 부분을 설정값에 변경을 주고 넘어가야하는 부분이다.