본문으로 바로가기

(문서 번역)정적 파일 관리

category 장고/기타 설정 방법 2019. 2. 2. 14:41

정적 파일 관리

- 문서바로가기



웹 사이트는 일반적으로 이미지, 자바스크립트 또는 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