Static File & Media File
1. Static File
: Javascript, CSS, Images 등 웹 서비스에서 사용하기 위해서 미리 서버에 저장해놓은 정적인 파일로, 사용자가 아닌 관리자 (서비스 제공자)가 사용하는 파일을 의미한다.
1-1. STATIC_URL
: 웹 페이지에서 사용할 정적 파일의 최상위 URL 경로로 각 static 파일에 대한 URL의 고정값을 설정한다.
# settings.py
...
STATIC_URL = '/static/'
...
- STATIC_URL은 정적 파일이 실제 위치한 경로를 참조한다. (STATIC_ROOT에 지정된 경로)
- 반드시 '/'로 끝나야 한다. → templates의 {% static '경로' %}에 대해서 해당 URL이 STATIC + '경로'로 바뀌게 되며 이는 다시 '/staitc/경로' 와 같이 바뀌기 때문이다.
1-2. STATICFILES_DIRS
: 애플리케이션에 전반적으로 사용되는 static 파일들이 위치한 경로를 설정한다.
...
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
...
추가로 지정해줘야 하고, 여러 경로에 정적 파일을 지정해둔 경우, 이 경로들을 리스트나 튜플형태로 담는다.
1-3. STATIC_ROOT
: Django 프로젝트에서 사용하는 모든 static 파일들을 한 곳에 모아넣는 경로이다.
...
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
...
- 실제 서비스 환경을 위한 설정 항목이다. 따라서 settings.py에서 DEBUG = True로 설정어 있으면 작용하지 않는다.
- static 파일을 직접 제공할 웹서버가 접근하여 다루게 된다.
- STATIC_ROOT 경로는 STATICFILES_DIRS에 등록된 경로와 똑같으면 안된다.
▶ static 파일들이 다른 경로에 나눠져 있는 경우, 서비스를 배포할 때 이들을 한 곳으로 모아야 한다.
python manage.py collectstatic
위의 명령어를 실행하면 각 Django 앱 디렉토리에 있는 static 디렉토리와 STATICFILES_DIRS에 지정된 경로에 있는 모든 파일을 모아준다. 이를 어디에다가 모아줄지는 따로 지정을 해주기 위해서 STATIC_ROOT를 사용하며, 지정된 경로에 디렉토리를 만들어 그 안에 모은 파일들을 복사한다.
1-4. Static 파일 제공
: Django 에서는 개발과정에 있어서 STAITCFILES_DIRS만 지정해준다면 프레임워크에 내장되어 있는 'django.contrib.staticfiles'가 알아서 static 파일들을 제공해준다.
1-5. Templates 사용
html 파일 상단에 입력시켜서 static 파일을 load한다.
{% load static %}
파일을 넣어줄 부분에 다음과 같이 작성하여 정적 파일들을 불러와준다.
{% static 'STATIC_URL 경로' %}
2. Media File
: 사이트 내에서 웹 서비스를 사용하는 사용자가 웹에서 upload하거나 다루는 파일이다.
2-1. MEDIA_URL
: 각 media 파일에 대한 URL의 고정값을 설정한다.
#settings.py
...
MEDIA_URL = '/media/'
...
이는 반드시 '/'로 끝나야하며, STATIC_URL과 다르게 설정해야한다.
2-2. MEDIA_ROOT
: 실제 media 파일이 저장될 경로를 지정해준다.
#settings.py
...
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
...
2-3. Media 파일 제공
: media 파일은 static 파일과는 다르게 개발 서버 자체에서 제공 지원을 해주지 않는다. 따라서 static 함수를 이용해 url 패턴을 만들어서 urls.py에 직접 제공방식을 추가해야 한다.
# urls.py
...
from django.conf import settings
from django.conf.urls.static import static
from django.views.static import serve
from django.urls import re_path
...
...
# DEBUG = TRUE일 때만 작동
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# DEBUG = FALSE일 때
urlpatterns += re_path(r'^media/(?P<path>.\*)$', serve, {'document_root': settings.MEDIA_ROOT,})
media 파일에 접근할 URL 접두사를 첫 번째 인자로 넣어주고 media 파일이 위치한 경로를 document_root라는 인자로 전달해주면 이를 내부적으로 serve 뷰 함수가 사용한다. serve 함수는 서버에 위치한 파일을 읽어서 스트리밍 방식으로 응답을 하게된다.
▶ 실제로 성능은 웹 서버보다 떨어지기 때문에, 개발 단계에서만 사용하는 것을 권장한다.