본문 바로가기
Django

STATICFILES_DIR vs STATIC_ROOT

by AlbertIm 2024. 10. 21.

시작

Django에서 정적 파일을 사용하는 과정에서 SETTINGSSTATIC_ROOT를 설정했음에도 불구하고 파일을 찾을 수 없는 문제가 발생했습니다.

본문

정적 파일 설정 방법

1. INSTALLED_APPSdjango.contrib.staticfiles를 추가합니다.

 

2.SETTINGSSTATIC_URL를 설정합니다.

 

STATIC_URL = "static/"

 

3. 템플릿에서 정적 파일 템플릿 태그를 사용하여 지정된 경로에 대한 URL을 작성합니다. staticfiles STORAGES 별칭을 활용할 수 있습니다.

 

{% load static %}
<img src="{% static 'assets/images/example.jpg' %}" alt="My image">

 

4. 정적 파일을 앱의 static 디렉토리에 저장합니다.

 

app-name/static/assets/images/example.jpg

 

개발 중 (DEBUG=True)에는 이 방법을 사용하면 Django가 자동으로 정적 파일을 찾아줍니다. 그러나 실제 서비스에서는 비효율적이므로 일반적으로 collectstatic 명령어를 사용하여 정적 파일을 수집한 후 다른 스토리지(S3 Storage 등)에 저장합니다.

APP 아래가 아닌 다른 위치 설정

APP 아래가 아닌 공통으로 사용할 정적 파일의 경우 STATICFILES_DIRS 설정을 사용합니다. 이 설정은 개발 중에도 정적 파일을 찾을 수 있습니다:

STATICFILES_DIRS = [
    BASE_DIR / "static",
]

 

정적 파일을 찾을 때는 STATICFILES_FINDERS를 통해 찾습니다:

[
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",
]

 

기본적으로 FileSystemFinderSTATICFILES_DIRS 설정을 사용하여 정적 파일을 찾고 만약 없으면 AppDirectoriesFinder가 실행되어 App 아래의 static 디렉토리에서 파일을 찾습니다.

djago.views.static.server() 뷰 사용 방법

INSTALLED_APPSdjango.contrib.staticfiles를 포함하지 않고 django.views.static.serve() 뷰를 사용하여 수동으로 정적 파일을 서빙할 수 있습니다.

 

예를 들어 STATIC_URLstatic/으로 정의되어 있다면 urls.py에 다음과 같은 코드를 추가하여 정적 파일을 서빙할 수 있습니다.

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... 나머지 URL 설정이 여기에 들어갑니다 ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

 

주의: 이는 실제 운영 환경에서는 적합하지 않습니다!!

정적 파일 배포하는 방법

운영 환경에서 정적 파일을 배포하는 과정은 두 가지 단계로 구성됩니다.

  1. collectstatic 명령어를 실행하면 정적 파일을 수집합니다.
  2. 수집한 정적 파일을 staticfilesSTORAGES 설정에 따라 수동으로 새 위치로 이동하거나 Storage 클래스의 post_process 메서드가 이를 처리할 수 있습니다.

예를 들어 S3 스토리지 백엔드를 사용할 경우

STORAGES = {
    # ...
    "staticfiles": {"BACKEND": "myproject.storage.S3Storage"}
}

마무리

STATIC_ROOTcollectstatic 실행 시 수집될 정적 파일의 위치를 지정하며 STATICFILES_DIRS는 개발 중 사용하는 정적 파일의 위치를 설정하는 데 사용됩니다.

댓글