티스토리 뷰
Static file
: Javascript, CSS, Image 등 웹 서비스에서 사용하기 위해 미리 서버에 저장해 놓은 정적 파일
- 파일 자체가 고정되어 있고, 서비스 중에도 추가되거나 변경되지 않음
1. settings.py 설정
settings.py
에 static
파일과 관련된 항목은 다섯 가지가 존재하며, 다음 세 가지를 주로 사용한다.
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)에 정적 파일을 둔 경우, 이 경로들을
list
나tuple
로 담음
1.3 STATIC_ROOT
: Django 프로젝트에서 사용하는 모든 static 파일들을 한 곳에 모아넣는 경로
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
-
실 서비스 환경을 위한 설정 항목
: 따라서,
settings.py
의DEBUG = 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.py
에 media
파일과 관련된 항목은 다음 두 가지가 있다.
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' 카테고리의 다른 글
[Django] {% url %}를 이용하여 query parameter 전달하기 (0) | 2020.03.25 |
---|---|
[Django Basic 13] default_storage (0) | 2020.02.26 |
[Django Basic 11] User 모델 확장 (0) | 2020.02.17 |
[Django basic 10] Django Autentication (0) | 2020.02.15 |
[Django Basic 09] {% csrf_token %} (0) | 2020.02.09 |
- Total
- Today
- Yesterday
- Django
- Redis
- 장고
- Django 컬렉션
- Django 댓글
- Django User
- 북마크 어플리케이션
- Django 좋아요
- Django 로그인
- Django 회원 정보 수정
- Django application
- Django 검색
- query parameter
- 파이썬
- Django 업로드
- Django 비밀번호 수정
- Redis Cache
- python
- Django 프로젝트 생성
- Django 회원가입
- Django 인스타그램
- Django 해시태그
- Django 어플리케이션
- Django 로그아웃
- Django Instagram
- Django 팔로우
- MySQL
- Django 북마크
- java
- 서점 어플리케이션
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |