• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

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

23.01.19 16:18 작성 23.01.19 16:19 수정 조회수 1.6k

1

강사님 안녕하세요!

오늘도 뭔가 따라하다가

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

라는 에러가 나더라구요. python manage.py runserver 자체는 되는데요.

어떻게 해결하는게 좋을까요?

참고로 강사님을 따라했다가 안되서 "버전이 제가 4버전을 써서 그런가.. 싶어서 3버전으로도 시도를 해봤는데 안되는 부분이 있어서 구글링 후 기존의 경로인 'static' 이런거를 '/static/'이런식으로 바꿔주긴 했습니다! (그런데 또 이게 문제가 될까? 싶기도해서요 ㅠㅠ

시도한 이후에 다시 장고4버전으로 변경했습니다.!

부분적으로 필요한 정보를 공유드립니다!

#1 common.py 파일

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

...

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates')
            # BASE_DIR / 'templates'
        ],
...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
...
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, '/static/')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# Default primary key field type
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

INTERNAL_IPS = ['127.0.0.1']

스크린샷 2023-01-19 오후 4.16.56.png

 


바로 위의 질문의 연장선상의 문제라고 보이는데요.

admin 페이지 경로자체도 없어졌습니다! 어떻게 해결하는게 좋을까요? ㅠㅠ

스크린샷 2023-01-19 오후 4.18.32.png

답변 1

답변을 작성해보세요.

1

STATICFILES_DIRS 에 지정하신 경로의 폴더는 반드시 존재해야 합니다.
collectstatic 명령에서는 파일복사가 이뤄지는 데, 이때 지정경로의 폴더가 없을 경우
말씀하신 STATICFILES_DIRS settings does not exist. 오류가 발생하는 거죠.

STATICFILES_DIRS 상의 폴더는 반드시 생성해주신 상태에서
collectstatic 명령을 내려주셔야 합니다.

collectstatic 명령의 동작이 그러합니다.

---

그리고, STATICFILES_DIRS 설정은
프로젝트 전반적으로 사용되는 정적인 파일을 넣어두는 디렉토리를 다수 지정할 수 있습니다.

각 장고앱에서만 사용되어지는 정적인 파일은
앱폴더/static 아래에 저장을 하고, 이는 별도의 설정이 필요없습니다.

그리고 STATIC_ROOT 설정은 collectstatic 명령 시에
각 디렉토리 별에 저장된 static 파일들을 복사하는 목적 디렉토리 경로입니다.

그렇기에 STATICFILES_DIRS 설정과 STATIC_ROOT 설정은 중복되어서는 안 됩니다.
복사의 source 경로와 destination 경로는 달라야겠죠.

STATICFILES_DIRS을 아래와 같이 설정하셨다면,

STATICFILES_DIRS = [
    # 장고 3에서 BASE_DIR이 문자열인 경우
    os.path.join(BASE_DIR, "static"),
    # pathlib을 사용할 경우
    BASE_DIR / "static",
]

STATIC_ROOT 는 아래와 같이 다르게 지정해주셔야 합니다.

# 장고 3에서 BASE_DIR이 문자열인 경우
os.path.join(BASE_DIR, "staticfiles")
# 장고 4에서 pathlib을 사용할 경우
BASE_DIR / "staticfiles"

화이팅입니다. :-)

답변 감사드립니다!!

하지만 여전히 해결이 안된 부분이 있어서 문의드릴게요! ㅠㅠ

1. 질문첫번째
말씀하신 것에 의하면
저는 django4의 pathlib을 사용중이라

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

에다가

pathlib과 강사님이 말씀해주신 것을 토대로

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    # os.path.join(BASE_DIR, '/static/')
    BASE_DIR / 'static'
]
# STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_ROOT = BASE_DIR / 'staticfiles'

MEDIA_URL = '/media/'
# MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_ROOT = BASE_DIR / 'media'

이렇게 바꾸어봤는데요.

여전히 동일한 에러가 나옵니다.. ㅠㅠ

2. 질문 두번째

그리고 초기경로 설정 등에 있어서 변수가 있어서 askcompany의 urls.py자체가
안읽어와지기 때문에 아예 admin에 접속하는 경로자체도 없는것으로 생각이 되는데요.
이거는 어떻게 해결을 하면 좋을까요?
혹시 몰라서 다시 캡쳐본 올리도록 하겠습니다!
image

  1. STATICFILES_DIRS 에 지정된 디렉토리 경로의 폴더가 존재하나요? 위 답변에서 collectstatic 명령 시에는 꼭 생성하셔야 된다고 답변드린 바 있습니다.

  2. 왜 askcompany/urls.py 자체가 안 읽혀와진다고 생각하셨을까요? 막연하게 생각하시기보다, 생각하시는 근거를 같이 제시해주시면, 보다 좋은 답변을 얻으실 수 있고, 답변을 얻으셨을 때 깨달으시는 바도 커집니다.
    아마도 askcompany/urls.py 파일에서 admin.site.urls 있으실 듯 하구요. 그럼에도 보여주신 스샷과 같이 등록된 urlpatterns 에는 django debug toolbar와 media 밖에 없다면, 이유는 하나 뿐입니다. debug toolbar나 media 설정을 urlpatterns에 추가하실 때, urlpatterns += 를 통해서 urlpatterns에 추가를 해주셔야 하는 데, urlpatterns = 를 쓰셔서, 덮어쓰기를 하셨을 수 있습니다.

제가 드린 답변을 얕게만 보시고 코드에 적용하셔서, 그냥 동일한 에러가 나온다라고만 이야기하시기보다, 시간이 걸리시겠지만 제가 드린 답변을 좀 더 깊게 이해해볼려고 노력해보셨으면 합니다.

관련 에피소드 영상도 꼭 한 번 다시 확인해보시구요.

제 강의는 반복해서 볼 때마다, 그 전에는 그냥 피상적으로 지나갔던 내용들이 더 깊게 다가온다고 많은 분들이 이야기해주시거든요.

또 질문 남겨주세요.

화이팅입니다. :-)

너무너무 감사합니다 강사님!!!

1. 관련해서는 python manage.py collectstatic
를 이전에 인지하기로는 "경로 자체만 설정되어도 충분했지 않았나?"
라는 생각에 강사님이 "STATICFILES_DIRS 상의 폴더는 반드시 생성해주신 상태에서"
라고 말씀을 해주셨음에도 귀담아 듣지 않은게 일단 첫번째 실패 요인이였네요 ㅠㅠ
죄송합니다

이어서 재차 말씀해주셨기에, 혹시나 하는마음에
python manage.py collectstatic
을 시도해보았습니다.
그런데 제가 원하는 위치는 manage.py, 프로젝트단위, 앱단위 폴더들과 동등선상에
놓는 것을 감안했던 것인데, 프로젝트 단위 폴더의 하위에 staticfiles가 생성이 되더라구요.

여기서 힌트를 얻어서 "BASE_DIR"이 잘못 설정되었다고 인지했습니다.
3.x버전때까지는 강사님이 dirname으로 한번씩 감쌀때마다 리눅스로 따지면 cd ..
와 같은 효과를 낸다고 인지를 했었는데, 4.x 버전으로 업뎃 되니깐 패턴이
dirname으로 감싸는게 아니라, .parent라고 붙이는 것으로 대체 된다고 인지했습니다.

하지만 기존에는 .parent가 2번있었고, 2번으로 인해서 프로젝트 단위 폴더의 하위에 staticfiles 폴더가 생성이 되었으니, 한번더 cd .. 효과를 주기 위해서
.parent를 붙여줌으로써 총 3번을 해줬더니 정상적으로 제가 희망하던 경로로 조정이 되었구요. 그에 따라서 각종 오류도 잡혔습니다!

2. 2번은 네 그렇습니다 +=로 추가가 아니라 =로써 오른쪽의 것을 왼쪽 urlpatterns에 배정해주는 구조로 짰기 때문에 아예 urls.py의 내용이 좀 씹혔었네요 ㅠㅠ

왜 urls.py를 읽지 못하는 경로문제라고 판단을 했냐면

path('admin/' ~~~~),

밑에 테스트용으로

path('', ~~~)

를 넣어주고 테스트를 해봤는데도 인지를 못했더라구요.

urlpatterns의 +=로 비롯된 문제라곤 생각을 못했습니다

urls.py를 읽어오는 내장함수중의 무언가의 경로에 이상이 있지 않을까. 라고 생각했었습니다!

결과적으로 너무너무 감사드립니다!! ㅠㅠㅠ

장고는 배울수록 어려운것같아요

뭔가 데쓰벨리에 걸려있는 상태라면 어서 이 구간을 벗어나고 싶은 마음입니다 ㅠㅠ

하지만 한편으로는 하나하나 알아가는게 알게모르게 쌓이고 있다는 사실도 체감을 하고 있기도 합니다!

잘 해결하셨습니다.

처음에는 책이나 강의나 답변들이 100% 눈에 들어오지 않습니다.
지금처럼 여러번 보시고 익히시다보면 조금씩 눈에 보이고, 이해도가 높아지시게 됩니다.

BASE_DIR 설정은 현 settings파일에 대한 상대경로로 계산을 하기에
참조하는 settings 파일의 디렉토리 경로가 더 깊어지거나 얕아졌을 경우
.parent 속성을 추가하거나 빼주어야 합니다.

그리고, urlpatterns 는 하나의 리스트이며 이 리스트가 한 번에 참조가 됩니다. 그러니 리스트 중 일부만 참조가 되는 경우는 없습니다. 일부만 참조가 된다면, 그 일부만 리스트에 남아있는 것이지요.

막상 알고나면 당연한 이야기이지만, 이해도가 낮을 때에는 이런 저런 상상을 하게 되는 것은 당연합니다만, 하나하나 차근차근 쌓아나가야만 합니다. 한 번에 얻어지는 것은 없거든요.

학습시간에 비례해서 실력이 늘면 좋겠지만, 모든 학습이 그렇지 않습니다. 학습시간이 늘더라도 실력은 조금씩 늘어나다가, 갑자기 점프하는 순간이 옵니다. 아래의 포스팅도 꼭!! 참고해보세요.

애자일 컨설팅 - 돈오점수

장고 뿐만 아니라, 모든 언어/프레임워크의 학습과정에서 겪는 어려움은 비슷할 것입니다. Java 진영에 비해서 Python 진영은 그 구간이 짧은 편이라고 생각합니다.

화이팅입니다. :-)

 

돈오점수에 관한 포스팅도 잘 읽어보았습니다.
좋은 정보 감사드립니다.
솔직히 조바심이 내심 있기는 합니다.
파이썬의 경우 기초에 대해서 이해하고 활용이 가능해진 시기도
유튜브에 보면 한두주만에 배우신다는 분들도 계시고 (물론 이건 이미 선행학습이 있었기 때문에 가능하다는것을 후에 알게되었습니다)

늦어도 2달정도면 뚝딱뚝딱 이해가 가능했던 것 같은데,

파이썬은 여러가지 라이브러리 활용까지 포함해서 6개월정도 걸렸고

장고는 4개월째 배우고 있는데도 가닥이 보이는듯, 안보이는듯 해서 "이게 과연 정상적인건가" 싶기도 했습니다.

그래서 조바심을 최대한, "장고에 대한 이해와 활용"에 중점을 맞추고 그 외적인 것들은 걷어내기 시작한게 최근이였구요.

언제가 될진 모르겠으나, 반드시 정진하여서 "다음 단계"로 넘어가도록 하겠습니다!

물론 기초를 탄탄히 하면서 시간이 많이 걸리더라도, 이슈가 나왔고 그 이슈가 어떻게든 구조적으로 이해가 가능하고, 해결이 가능한거라면 그것을 해결하는데 시간과 정성을 쏟을 예정입니다!

모쪼록 좋은 강의와 특별히 좋은 답변 감사드립니다! ㅠㅠ