시작
Django에서 정적 파일을 사용하는 과정에서 SETTINGS
의 STATIC_ROOT
를 설정했음에도 불구하고 파일을 찾을 수 없는 문제가 발생했습니다.
본문
정적 파일 설정 방법
1. INSTALLED_APPS
에 django.contrib.staticfiles
를 추가합니다.
2.SETTINGS
에 STATIC_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",
]
기본적으로 FileSystemFinder
가 STATICFILES_DIRS
설정을 사용하여 정적 파일을 찾고 만약 없으면 AppDirectoriesFinder
가 실행되어 App 아래의 static
디렉토리에서 파일을 찾습니다.
djago.views.static.server()
뷰 사용 방법
INSTALLED_APPS
에 django.contrib.staticfiles
를 포함하지 않고 django.views.static.serve()
뷰를 사용하여 수동으로 정적 파일을 서빙할 수 있습니다.
예를 들어 STATIC_URL
이 static/
으로 정의되어 있다면 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)
주의: 이는 실제 운영 환경에서는 적합하지 않습니다!!
정적 파일 배포하는 방법
운영 환경에서 정적 파일을 배포하는 과정은 두 가지 단계로 구성됩니다.
collectstatic
명령어를 실행하면 정적 파일을 수집합니다.- 수집한 정적 파일을
staticfiles
의STORAGES
설정에 따라 수동으로 새 위치로 이동하거나Storage
클래스의post_process
메서드가 이를 처리할 수 있습니다.
예를 들어 S3 스토리지 백엔드를 사용할 경우
STORAGES = {
# ...
"staticfiles": {"BACKEND": "myproject.storage.S3Storage"}
}
마무리
STATIC_ROOT
는 collectstatic
실행 시 수집될 정적 파일의 위치를 지정하며 STATICFILES_DIRS
는 개발 중 사용하는 정적 파일의 위치를 설정하는 데 사용됩니다.
'Django' 카테고리의 다른 글
DRF Tutorial 6 ViewSets & Routers (3) | 2024.09.14 |
---|---|
DRF Tutorial 5 Relationships & Hyperlinked APIs (0) | 2024.09.14 |
DRF Tutorial 4 Authentication & Permissions (1) | 2024.09.14 |
DRF Tutorial 3 Class-based Views (0) | 2024.09.14 |
DRF Tutorial 2 Requests and Responses (1) | 2024.09.11 |
댓글