본문 바로가기

Python/Frameworks.Libraries

[Django] Django에서 static 과 media 이용하기. DEBUG=False일 때 static

문제점

Django를 막 입문한 뒤 프로젝트를 배포하려고 settings.py에서 DEBUG=False로 바꾸는 순간 경악을 금치못할 수 있다.

DEBUG=False로 바꾸는 순간 runserver로 서버를 돌릴 시 static file, media file들이 제공이 안 됐을 것이다.

웹서버uWSGIDjango를 연동할 때에도 마찬가지이다. 그래서 static file과 media file은 웹서버에서 전송해주는 것이 바람직하지만 너무도 귀찮고 경우가 여러가지라 복잡하다.

그래서 정리해본다.

문제의 원인은?

기본적으로 Djangorunserver 기능은 개발 과정에서 편리하도록 임시적으로 웹서버 기능을 하기 위한 것이라고 하고 만약 배포하는 과정이라면 DEBUG=False 로 두는 것이 바람직하고, static file (static 경로에 있는 파일들 및 업로드, media 등등) 은 웹서버 (Nginx or Apache)가 제공하는 것이 바람직.

따라서 일반적으로 DEBUG=False인 경우는 static file을 django project에서 직접 제공할 수 없다.

python manage.py runserver로 서버를 돌릴 때에는 가능은 하지만 uWSGINginx 등과 연동해서 사용할 때는 거의 그럴 수 없다.

해결방안들

크게 세 가지 주제로 분류할 수 있다.

DEBUG=True일 때, False 일 때

그리고 각각 static file에 대해, media file에 대해.

runserver --insecure 라는 인자를 주면 DEBUG=False여도 static file을 제공할 수 있다,

  runserver runserver --insecure
DEBUG=True

STATIC - O

MEDIA - O

DEBUG=True이면 --insecure 안 해줘도 됨,

DEBUG=False

STATIC -X

MEDIA - X

STATIC - O

MEDIA - X, 수동으로 url 등록해줘야함.

일반적으로 runserver 시에 편리상으로. 즉 DEBUG=True일 때 Media와 static을 이용하는 방법

urlpattern += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

하지만 이 방법은 어떤 조건에서든 DEBUG=True, runserver 로 서버 돌릴 때에만 작동함.

만약 DEBUG=False인 경우엔

python manage.py runserver --insecure로 static file 까지는 제공가능하지만, media의 경우 지원되지 않음.

그럴 땐 아래와 같이 urlpatterns에 직접 등록해서 media file 제공 가능.

from django.conf.urls.static import static
from django.views.static import serve
from django.conf import settings
from django.conf.urls import url

urlpattern+=url(r'^media/(?P<path>.\*)$', serve, {
    'document_root': settings.MEDIA_ROOT,
})

STATIC_URL은 static file들을 라우팅 시킬 URL이다.

STATICFILES_DIRS는 runserver 을 통해서 static file에 접근할 때 이용할 경로들.

STATIC_ROOT 는 웹서버와 연동하기 위해 지금까지 필요했던 static 파일들을 다 모을 때 이용할 경로. collectstatic에 이용됨.

MEDIA_URL 은 STATIC_URL과 같은 목적

MEDIA_ROOT 은 collectstatic이 아닌 업로드 시에 이용됨. model의 upload_to에 대한 base location

위의 방법들을 제외하면, 웹서버에 /static/ 에 대한 reverse proxy 를 구현하는 식의 방법이 가장 적절할 것 같다.