Python/Python Study

Static File & Media File

SeongWon 2020. 4. 8. 19:24
반응형

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 함수는 서버에 위치한 파일을 읽어서 스트리밍 방식으로 응답을 하게된다.

 

▶ 실제로 성능은 웹 서버보다 떨어지기 때문에, 개발 단계에서만 사용하는 것을 권장한다.

반응형