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

Django - ?: (staticfiles.W004) The directory '/static/' in the STATICFILES_DIRS setting does not exist. (해결)

by 다니엘의 개발 이야기 2023. 1. 20.
320x100

와... 이번편은 정말 어려웠었다.

이진석 강사님이 답변을 안해주셨다면 찾는건 고사하고 장고는 일단 접고 들어갔을듯 하다..

 

우선

?: (staticfiles.W004) The directory '/static/' 
in the STATICFILES_DIRS setting does not exist.

이 메세지를 봐보자.

/static/이라는 경로안에

STATICFILES_DIRS 세팅이 존재하지 않는다.

라는 말이다.

 

이거는

# settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    BASE_DIR / 'static'
]
STATIC_ROOT = BASE_DIR / 'staticfiles'

MEDIA_URL = '/media/'

MEDIA_ROOT = BASE_DIR / 'media'

여기에 정의된 URL, DIRS를 보게되면 총 5개로써

STATIC 즉, 정적파일 요소 관련 정의는 3개고

MEDIA 즉, 미디어파일을 전송받고 보관하는 관련 정의는 2개임을 볼 수 있다.

 

우선 이렇게 정의가 되어있는 상태에서 나와같은 문제가 발생하신 분은

우선

manage.py 파일이 있는 경로에 가셔서

python manage.py collectstatic

이 명령을 터미널을 통해서 입력해보세요.

그러면 어딘가에 'staticfiles'라는 폴더가 생성될거고

그 내부에는 내가 전체적으로 어떤 파일들을 static 폴더를 활용하여 정의해놓았냐 등에 의해서

프로젝트에 딸린 모든 static 파일을 모아주는 역할을 합니다.

저의 경우에는 이렇게 나왔네요.

 

중요한 것은 staticfiles폴더안에 "어떤 내용"이 있느냐가 아닙니다.

"어떤 위치"에 생성이 되었느냐 입니다.

만약

-프로젝트

-앱

-manage.py

-staticfiles

이런식으로 프로젝트 단위, 앱, manage.py와 동등선상에 놓여졌다면

경로는 정상적일것이고 

?: (staticfiles.W004) The directory '/static/' 
in the STATICFILES_DIRS setting does not exist.

에러는 볼 수 없을 것입니다.

 

만약에 내가 python manage.py collectstatic

을 통해서 프로젝트 단위와 동등선상에 놓인것이 아니라면 경로조정이 필요합니다.

 

settings.py를 보게되시면 안에

BASE_DIR = Path(__file__).resolve().parent.parent.parent

이게 보이실겁니다.

이 BASE_DIR이 왜 중요하냐면, 앞서서 5개의 STATIC, MEDIA 관련 ROOT와 URL을 정의해줄때 사용되었던

BASE_DIR이 바로 이것이기 때문입니다.

 

앞의 Path(__file__).resolve()

는 쉽게 생각해서 "지금 이 settings.py이 들어있는 경로"를 생각하시면 됩니다.

이거는 터미널(리눅스)의 개념을 조금이라도 이해하셔야 이해가 되는 개념인데요.

 

터미널에서는 경로변경을 할때 cd를 합니다.

cd <원하는경로>

로 이동을 하거나

 

cd ..

로 바로 이전 폴더 단계로 가기도 하죠.

가령 예를들어서

 

cd Desktop/total_project

라고 할경우에는 mac의 경우에

바탕화면에 있는/total_project로 이동할래요.

라는 의미고

 

이동이 된 상태에서

cd ..

를 하게 되면 (띄어쓰기에 유의)

Desktop 경로에 머무르게 됩니다.

즉, settings.py가 예를들어서

 

할아버지경로/아버지경로/자식경로/settings.py

에 있게 된다면

 

할아버지경로가 프로젝트 단위와 동등 선상에 놓이기 위해서는 3번을 나가야 합니다.

Path(__file__).resolve()는 

할아버지경로/아버지경로/자식경로/settings.py

를 의미하고

 

Path(__file__).resolve().parent

는 

 

할아버지경로/아버지경로/settings.py

를 의미하고

 

Path(__file__).resolve().parent.parent

 

할아버지경로/settings.py

를 의미하죠.

 

즉, 예시의 경우에는 .parent가 총 3번이 있어야 할아버지 경로와 동등선상에 있게되고

이렇게 경로를 조정해준 후에

다시

python manage.py collectstatic

를 해주게 되면, 프로젝트 단위와 동등선상에

staticfiles 폴더로 인해서 static 내용들이 하나로 합쳐질것이고

그 이후에 python manage.py runserver를 하게되면 이제는 그 에러가 사라질 것입니다.


# 여담

 

여담이지만

Django 3.x 버전 이하일때는 BASE_DIR의 표기가 달랐습니다.

이것도 관련하여 간략히 알려드리겠습니다.

물론 응용은 위의 내용을 참고하시면 충분히 해결 가능합니다.

BASE_DIR = dirname(dirname(abspath(__file__)))

이게 3.x 버전의 BASE_DIR인데요.

dirname()으로 한번 감쌀때마다 4.x 버전 이후의 .parent와 동일한 효과를 냅니다.

3.x의 abspath(__file__)은

4.x의 Path(__file__)과 같고요

STATICFILES_DIRS = [
	os.path.join(BASE_DIR, '/static/')
]

그리고 3.x이하버전의 경로는 이런식으로 해줬습니다.

비교를 위해서 4.x버전은

STATICFILES_DIRS = [
	BASE_DIR / '/static/'
]

이구요.

300x250