문제점
Django
를 막 입문한 뒤 프로젝트를 배포하려고 settings.py
에서 DEBUG=False
로 바꾸는 순간 경악을 금치못할 수 있다.
DEBUG=False
로 바꾸는 순간 runserver
로 서버를 돌릴 시 static file, media file들이 제공이 안 됐을 것이다.
웹서버
와 uWSGI
와 Django
를 연동할 때에도 마찬가지이다. 그래서 static file과 media file은 웹서버에서 전송해주는 것이 바람직하지만 너무도 귀찮고 경우가 여러가지라 복잡하다.
그래서 정리해본다.
문제의 원인은?
기본적으로 Django
의 runserver
기능은 개발 과정에서 편리하도록 임시적으로 웹서버 기능을 하기 위한 것이라고 하고 만약 배포하는 과정이라면 DEBUG=False
로 두는 것이 바람직하고, static file (static 경로에 있는 파일들 및 업로드, media 등등) 은 웹서버 (Nginx
or Apache
)가 제공하는 것이 바람직.
따라서 일반적으로 DEBUG=False
인 경우는 static file을 django project에서 직접 제공할 수 없다.
python manage.py runserver
로 서버를 돌릴 때에는 가능은 하지만 uWSGI
와 Nginx
등과 연동해서 사용할 때는 거의 그럴 수 없다.
해결방안들
크게 세 가지 주제로 분류할 수 있다.
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 를 구현하는 식의 방법이 가장 적절할 것 같다.
'Python > Frameworks.Libraries' 카테고리의 다른 글
Django, uWSGI, NGINX 헷갈리는 거 정리, 꿀팁, Cheating Sheets (0) | 2019.09.22 |
---|---|
docker-compose를 통해 Nginx, Django 연동하기 2 - Django App과 uWSGI 연동하기 (0) | 2019.09.08 |
Django App Templates Directory. 장고 앱 템플릿 디렉토리 구조에 대해 (0) | 2019.09.02 |
Django 테이블 삭제하는 방법. django.db.utils.OperationalError: no such table 오류 해결 방법 (0) | 2019.09.01 |
docker-compose를 통해 Nginx, Django 연동하기 1 - 간단한 Django app 만들기 (0) | 2019.07.22 |