정적 파일 관리
- 문서바로가기
웹 사이트는 일반적으로 이미지, 자바스크립트 또는 CSS 와 같은 추가 파일을 제공해야 한다.
Django 에서는 이러한 파일을 "static files" 라고 부른다.
(django.contrib.staticfiles 를 제공하여 이를 관리)
이 페이지에서는 이러한 정적 파일을 제공하는 방법에 대해 설명한다.
정적 파일 설정하기
1. INSTALLED_APPS 에 django.contrib.staticfiles 가 포함되어있는지 확인
- Django 를 설치하면 자동으로 설정이 되는데, 알고 사용하는 것과 모르고 사용하는 것은 차이가 있다.
INSTALLED_APPS = [ django.cnotrib.staticfiles ]
2. settings.py 에 STATIC_URL 이 정의되어있는지 확인
- 이 부분도 자동으로 설정되어 있음
STATIC_URL = '/static/'
3. 템플릿에서 static 템플릿 태그를 사용하여 구성된 STATICFILES_STORAGE 를 사용하여 지정된 상대 경로의 URL 을 빌드
- img src 에서 <> 는 티스토리 태그에서 그대로 사용되어 없는 이미지로 표시되기 때문에 제외
{% load static %} img src="{% static " my_app="" example.jpg"="" %}"="" alt="My image"
4. static file 을 앱의 static 경로에 저장
my_app / static / my_app / example.jpg
프로젝트에는 특정 앱에 묶여 있지 않은 고정 자산도 있을 것이다. 앱 내부에 static / directory 를 사용하는 것 외에도 Django 가 정적 파일을 찾는 설정 파일에서 디렉토리 목록(STATICFILES_DIRS)를 정의할 수 있다.
STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'STATIC'), ]
(P.S)Static files namespacing
이제 정적 파일을 my_app/static/ 에 직접 두는 것(다른 my_app 하위 디렉토리를 만드는 대신)을 할 수는 있지만 이는 실제로는 추천하지 않는다. Django 는 이름이 일치하는 첫 번째 정적 파일을 사용한다. 다른 응용 프로그램에 같은 이름의 정적 파일이 있으면 Django 는 이들을 구별할 수 없다. 우리는 Django 가 올바른 것을 가리킬 수 있어야 하며, 이것을 보장하는 가장 쉬운 방법은 네임스페이스를 지정하는 것이다. 즉, 정적 파일을 응용 프로그램 자체의 이름이 지정된 다른 디렉토리에 저장한다.
[comment] 이 부분에 대한 이해가 맞는지 모르겠지만 장고로 생성한 app(이를테면 members / posts) 와 같은 경로에 static 이라는 디렉토리를 만들어 관리를 한다. 라는 것으로 이해가 된다.
개발 중에 static files 를 검색하기
위에서 설명한대로 django.contrib.staticfiles 를 사용하면 DEBUG 가 True 로 설정된 경우 runserver 가 자동으로 작업을 수행한다.
INSTALLED_APPS 에 django.contrib.staticfiles 가 없으면,
django.views.static.serve() 뷰를 사용하여 수동으로 정적 파일을 제공할 수 있다.
프로덕션 용도로는 적합하지 않다. 일반적인 배포 전략 중 일부는 정적 파일 배포를 참조(바로가기)
예를 들어 STATIC_URL 이 /static/ 으로 정의된 경우 urls.py 에 다음 스니펫을 추가하여 이 작업을 수행할 수 있다.
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # ... 나머지 설정 파일들 ... ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
이 helper function(도우미 함수) 은 디버그 모드에서만 작동하며 주어진 접두사가 URL 이 아닌 로컬 (예: /static/) 이고,
http://static.example.com/ 과 같은 경우에만 작동한다.
또한 이 helper function 은 실제 STATIC_ROOT 폴더만 제공한다. django.cnotrib.staticfiles 와 같은 정적 파일 검색은 수행하지 않는다.
개발 중 사용자가 업로드한 파일 제공
개발하는 동안 django.views.static.serve() 뷰를 사용하여 MEDIA_ROOT 에서 사용자가 업로드 한 미디어 파일을 제공할 수 있다.
프로덕션 용도로는 적합하지 않다. 일반적인 배포 전략 중 일부는 정적 파일 배포를 참조(바로가기)
예를 들어 MEDIA_URL 이 /media/ 로 정의되어 있는 경우 urls.py 에 다음 스니펫을 추가하여 이 작업을 수행할 수 있다.
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # ... 나머지 설정 파일들... ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
이 helper function(도우미 함수) 은 디버그 모드에서만 작동하며 주어진 접두사가 URL 이 아닌 로컬 (예: /media/)이고,
http://media.example.com/ 과 같은 경우에만 작동한다.
[comment] 즉, urlpatterns 에서 2가지 처리 방법을 가진다.
1. urls.py(urlpatterns) --> views.py --> (생략) --> browser
- 일반적인 기능(CRUD, api 연동) url 을 처리
2. static(media/category/superstar_shoes.jpg)
- MEDIA_URL + MEDIA_ROOT 로 이동하여 이미지 파일을 보내줌
- # localhost:8000/media/category/superstart_shoes.jpg
Testing(테스팅)
- 테스트 환경에 대한 내용에 대한 이해는 다음 기회에...
내장 테스트 클라이언트 대신 실제 HTTP 요청을 사용하는 테스트를 실행할 때 (즉, 내장 LiveServerTestCate 를 사용할 때) 정적 환경은 나머지 컨텐츠와 함께 제공되어야하므로 테스트 환경에서 실제 환경을 충실히 재현한다. 가능하지만 LiveServerTestCase 는 매우 기본적인 정적 파일 제공 기능만 있다. 정적 파일 응용 프로그램의 찾기 기능에 대해 알지 못하며 정적 컨텐츠가 STATIC_ROOT 아래에 이미 수집되었다고 가정한다.
이 때문에 staticfiles 는 자체 테스트의 실행 중에 모든 자원을 투명한 방식으로 제공하는 내장 된 서브 클래스인 자체 django.contrib.staticfiles.testing.StaticLiveServerTestCase 를 제공한다.
DEBUG=True 로 개발될 때, 즉 collectstatic 을 먼저 사용하여 수집하지 않아도 된다.
Deployment(배포)
django.contrib.staticfiles 는 정적 파일을 단일 디렉토리에 수집하여 쉽게 제공할 수 있는 편리한 관리 명령을 제공한다.
1. STATIC_ROOT 설정을 이 파일을 제공할 디렉토리로 설정
STATIC_ROOT = "var/www/example.com/static"
2. collectstatic 관리 명령 실행
$ python manage.py collectstatic
- 이렇게하면 static 폴더의 모든 파일이 STATIC_ROOT 디렉토리로 복사된다.
[comment] 대표적으로 admin 페이지의 css 파일
3. 원하는 웹 서버를 사용하여 파일을 제공한다. 정적 파일 배포에는 정적 파일에 대한 일반적인 배포 전략이 포함된다.
'장고 > 기타 설정 방법' 카테고리의 다른 글
django.setup() 에러 발생 (0) | 2019.06.10 |
---|---|
return 할 때 render & redirect 의 차이 (0) | 2019.02.17 |
SECRET KEY 를 json 으로 따로 관리 (0) | 2018.12.25 |
Media Root 설정하기 (0) | 2018.12.13 |