티스토리 뷰

Static file

: Javascript, CSS, Image 등 웹 서비스에서 사용하기 위해 미리 서버에 저장해 놓은 정적 파일

  • 파일 자체가 고정되어 있고, 서비스 중에도 추가되거나 변경되지 않음

1. settings.py 설정

settings.pystatic 파일과 관련된 항목은 다섯 가지가 존재하며, 다음 세 가지를 주로 사용한다.

1.1 STATIC_URL

: 웹 페이지에서 사용할 정적 파일의 최상위 URL 경로. 각 static 파일에 대한 URL의 고정값을 설정

# settings.py 초기 설정값. 원하는 경로로 변경 가능
STATIC_URL = '/static/'
  • STATIC_URL은 정적 파일이 실제 위치한 경로를 참조

    : STATIC_ROOT 에 지정된 경로

  • 반드시 /로 끝나야 함

    : template 파일의 {% static '경로' %} 에 대해서 해당 URL 이 STATIC_URL + '경로' 로 바뀌게 되고

     

    이는 다시'/static/경로' 다음과 같이 바뀌기 때문

 

1.2 STATICFILES_DIRS

: 프로젝트 전반적으로 사용되는 static 파일들이 위치한 경로를 설정

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
  • 추가로 지정해야 함
  • 여러 경로(path)에 정적 파일을 둔 경우, 이 경로들을 listtuple로 담음

 

1.3 STATIC_ROOT

: Django 프로젝트에서 사용하는 모든 static 파일들을 한 곳에 모아넣는 경로

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  • 실 서비스 환경을 위한 설정 항목

    : 따라서, settings.pyDEBUG = True로 설정되어 있으면 작용하지 않음

  • static 파일을 직접 제공(serving)할 웹 서버가 접근하여 다룬다.

  • STATIC_ROOT 경로는 STATICFILES_DIRS 등록된 경로와 같으면 안됨

 

static 파일들이 다른 경로에 나눠져 있는 경우, 서비스를 배포할 때 이들을 한 곳으로 모아야 한다.

 

이때 사용하는 명령어가 아래와 같다.

python manage.py collectstatic

위의 명령어를 실행하면 각 Django 앱 디렉터리에 있는 static 디렉터리와 STATICFILES_DIRS에 지정된 경로에

 

있는 모든 파일을 모은다. 하지만 어디로 모아야할 지는 따로 지정을 해줘야 하기 때문에 STATIC_ROOT 을 사용하여

 

경로를 지정한다. 지정된 경로에 디렉터리를 만들어 그 안에 모은 파일들을 복사한다.

 

2. Static 파일 제공(serving)

: 개발 단계에선 STATICFILES_DIRS 만 지정해주면 Django 프레임워크에 내장된 'django.contrib.staticfiles'

static 파일들을 제공

 

3. templates 에서 사용하기

먼저 static 파일을 사용하기 위해 파일 상단에 다음과 같이 추가하여 static 파일을 load한다.

{% load static %}

load한 후에는 다음과 같이 여러 정적 파일들을 불러올 수 있다.

{% static 'STATIC_URL 이후의 경로' %}

 

 

Media file

: 웹사이트 사용자가 웹에서 올리는 파일

  • 파일 자체는 고정되어 있지만, 언제 어떤 파일이 정적 파일로 제공되고 준비되는지 예측할 수 없음

1. settings.py 설정

settings.pymedia 파일과 관련된 항목은 다음 두 가지가 있다.

1.1 MEDIA_URL

: 각 media 파일에 대한 URL 의 고정값을 설정

MEDIA_URL = '/media/'
  • 반드시 /로 끝나야 함
  • STATIC_URL 과 달라야 함

 

1.2 MEDIA_ROOT

: 실제 media 파일이 저장될 ROOT 경로를 지정

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  • FileField 를 통해서 저장할 때, DB에 파일의 경로를 문자열로 저장하기 위해 사용
  • STATIC_ROOT 와 달라야 함

 

2. Media 파일 제공(serving)

: media 파일은 static 파일과 다르게 개발 서버에서 serving을 지원해주지 않는다. 따라서, static 함수를 이용해

 

url pattern을 만들어 urls.py 에 직접 serving rule을 추가해야 한다.

# 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)를 첫 번째 인자로 넣고 media 파일이 위치한 경로를 document_root라는

 

인자로 전달하면, 이런 내용을 내부적으로 serve 라는 뷰 함수가 사용한다. serve 함수는 서버에 위치한 파일을 읽어서

 

스트리밍 방식으로 응답한다. 즉, 실제 파일 제공한다.

 

(그러나 성능은 웹 서버보다 떨어지므로 개발 단계에서만 쓰는 게 좋다.)

 


참고 자료

 

[Django] static 파일 다루기

Static 파일이란? static 파일이란 js, css, image, font 등과 같이 개발자가 사전에 미리 서버에 저장 해둔 파일들을 말합니다. 정적인 파일들이라고 할 수 있습니다. settings 에서의 설정 STATIC_URL STATIC_UR..

ssungkang.tistory.com

 

6. Django 정적 파일 기능 이해하기 · Kay on the rails

6. Django 정적 파일 기능 이해하기 26 Apr 2015 지난 5회에서 다룬 정적 파일을 Django에서 어떻게 다루는지 자세히 알아 보겠습니다. 1. Django와 정적 파일 웹 서버와 웹 애플리케이션, 그리고 정적 파일 웹 게시판이나 블로그, 또는 우리가 만들 Pystagram은 웹 프로그램 또는 웹 애플리케이션입니다. 이런 웹 애플리케이션이 필요한 이유는 뭘까요? 웹 서버는 웹 클라이언트가 특정 위치에(URL) 있는 서버 저장소(storage

blog.hannal.com

 

조누스의 걸음마 개발로그

안녕하세요 열정괴물 신입개발자 조누스의 개발로그입니다.

chohyeonkeun.github.io

 

댓글