본문 바로가기
프로그래밍/Django(장고)

[Django/장고]Debug = False static 파일 경로 이슈 - debug false then static href not found -Solved

by Mr.noobiest 2024. 9. 19.

django

Django  개발중 이슈 발생


Django 사이트 개발이 막바지 단계라 이제 Debug를 True에서 False로 변경하여 민감한 정보들을 사용자에게 노출시키지 않으려고 했다.

settings.py에서 기존의 Debug = True를 Debug = False로 변경하고 아래 코드를 추가하였다.

SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 3600
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

그리고 서버를 다시 켰는데....

 

 


 

 

static폴더안의 파일과의 링크가 끊겼다.


html이나, static경로를 사용하는 모든 webp, css, js 등의 파일이 정상적으로 로드되지 않는 증상이 발생하였다....

<link rel="stylesheet" href="{% static 'css/test_css/style.css' %}">

위 코드와 같은 형태가 동작하지 않는 건데,,,, 원인은 간단하다.

django가 해당 파일의 경로를 못찾는것이다.


debug=True일때와 debug=False일때의 static 경로를 찾는 방식이 달라서 발생하는 문제이다.

 


 

Difference Between DEBUG=True and DEBUG=False

 

DEBUG=True일 때

  1. 개발 환경에서의 정적 파일 서빙
    • 개발 중에는 Django가 개발 서버(runserver)를 통해 정적 파일을 자동으로 서빙합니다. 즉, Django 자체가 STATIC_URL로 설정된 경로를 처리하고, 정적 파일을 요청하는 브라우저에 바로 전달합니다.
    • 개발 시에는 웹 서버(Nginx, Apache 등)가 따로 필요하지 않으며, python manage.py runserver 명령어만으로 정적 파일이 제공됩니다. 이때 collectstatic 명령을 실행할 필요도 없습니다.
  2. 임시로 개발용 서버가 정적 파일을 제공
    • 개발 중에는 파일을 빠르게 로드하기 위해 Django의 자체 서버(runserver)가 정적 파일을 서빙하는 임시적인 용도로 동작합니다. 이 방식은 오직 개발 환경에서만 사용되며, 성능이 떨어지고, 보안상의 문제가 있을 수 있습니다.

 

DEBUG=False일 때

  1. 운영 환경에서는 Django가 정적 파일을 서빙하지 않음
    • 운영 환경에서는 Django가 성능과 보안 문제로 인해 직접 정적 파일을 서빙하지 않습니다. 즉, DEBUG=False일 때는 Django가 정적 파일 요청을 처리하지 않도록 설계되어 있습니다.
    • 대신, **웹 서버(예: Nginx, Apache)**가 정적 파일을 서빙하는 역할을 해야 합니다. Django는 운영 환경에서 웹 서버가 정적 파일을 처리할 수 있도록 collectstatic 명령어로 모든 정적 파일을 한 곳으로 모아야 합니다.
  2. 정적 파일 서빙을 위한 준비 작업 필요
    • DEBUG=False에서 정적 파일이 제공되기 위해서는 다음 작업들이 필요합니다:
      • 정적 파일을 수집(collectstatic): python manage.py collectstatic 명령어를 통해 정적 파일들을 한 곳(STATIC_ROOT)에 모아야 합니다.
      • 웹 서버 설정: 웹 서버(Nginx, Apache 등)가 정적 파일을 제공할 수 있도록 설정해야 합니다. 예를 들어, Nginx는 /static/ 경로에 대한 요청을 STATIC_ROOT로 지정된 디렉터리에서 처리하도록 설정합니다.

 

 

요약하자면 로컬 PC에서 서버를 실행할때에는 웹서버를 안쓰므로(쓰는 경우도 있지만) 정적경로를 찾는 역할을 웹서버 대신에 runserver가 처리해주는거고, 웹서버를 쓰는 경우에는 웹서버에서 정적파일의 경로를 찾아주므로 runserver에서 debug=False일때 정적파일을 찾는 작업을 실행하지 않는 것이다.

 


 

해결방법

 

1. setting.py에서 경로를 지정한다.

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
STATIC_URL = 'static/'
STATICFILES_DIRS = [
    BASE_DIR / 'static',
]

INSTALLED_APPS = [
    'django.contrib.staticfiles',
]

ALLOWED_HOSTS = ['your-domain.com', 'your-server-ip']

2. collectstatic 명령어 실행하기

python manage.py collectstatic

3. nginx에서 진행할 경우 정적파일 경로 지정하기

location /static/ { alias /path/to/your/project/staticfiles/;  # STATIC_ROOT 경로 }

4. html에 {% load static %} 이 있는지 확인하기

 


 

위 모든 작업을 진행한 이후 서버를 재시작하면 됩니다.

끝.

 

 

 

 

728x90
반응형