[Django] 장고 Models를 활용한 데이터베이스 처리#3_장고가 media 파일을 다루는 방법

아직·2022년 6월 21일
0
post-thumbnail

1)

장고에서 모델의 FileField/ImageField를 이용해 저장한 모든 파일을 media 파일이라고 한다. css, js 등 개발 리소스로서 우리가 흔히 사용하는 정적인 static 파일과 대조할 수 있다.

2)

Post 클래스에 ImageField를 넣어주고 해당 필드가 내부적으로 사용하는 pillow 라이브러리를 설치했다.(과거 pil 라이브러리를 사용했다고 하는데 이는 더 이상 업데이트 되지 않는다고 한다. 포토샵 같은 고품질 이미지 작업을 위한 것은 아님.

3)

먼저 뷰 함수의 .FILES 속성을 통해 파일이 전달된 다음, 유효성 처리를 거친다. 그리고 실제 파일은 파일 스토리지에 저장되고 필드를 통해 db에 저장되는 것은 문자열화된 파일의 경로이다.

4)

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

__file__의 부모(dirname)의 부모가 BASE_DIR에 해당하는데, 이 환경의 'media' 폴더를 media root로 사용하고 여기에 저장하겠다. 해당 폴더가 없다면 소스 파일과 섞일 우려가 있다.

5)

MEDIA_URL = '/media/'

해당 미디어에 접근을 요청할 때 http://localhost:8000/media/image0_2.jpeg 이런 식으로 접근하게 된다. 이 때 접근 경로를 '읽는' 기능은 장고 기본에 있지 않으므로 만들어줘야 하는데

from django.conf.urls.static import static
...
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

위 부분이 "MEDIA_ROOT 부분을 MEDIA_URL 형식에 맞게 가져와서 urlpatterns에 추가하는" 요청에 해당한다. DEBUG는 개발자 모드에서만 TRUE이기 때문에 if문 줄이 없으면 빈 리스트를 돌려줘서 읽을 수 없다.

0개의 댓글