31.Django(장고) - ecommerce 프로젝트 - 쇼핑몰 - 미디어 폴더 이해 및 처리

JungSik Heo·2024년 12월 8일

Static & Media 파일

1. Static

  • 개발 리소스로서의 정적인 파일 (js, css, image 등)
  • 앱 / 프로젝트 단위로 저장 및 서빙
  • 이미 가지고 있는 파일들을 보여주는 것이기에 외부와 통신할 필요 없음.
  • settings.py에서 static 파일이 어디에 있고, 어디로 모을지를 설정해줌.

2. Media

  • 사용자가 업로드한 파일을 받아와야 하는 것이기에 외부와의 통신 필요
  • 유저가 업로드 한 모든 정적인 파일 (image, pdf)
  • 관리자가 admin 페이지에서 올리는 파일도 포함이다.
  • ImageField 도 FileField 를 상속받은 필드로서 해당 필드로 저장된 파일도 media 파일
  • FileField/ImageField를 통해 저장한 모든 파일
  • 💡 DB필드에는 저장경로(문자열)를 저장하며, 파일은 File Storage에 저장된다.
  • 💡 프로젝트 단위로 저장 및 서빙

Media 파일은 웹사이트 이용자가 올리는 파일이기 때문에 App 차원에서 직접 관리할 필요가 없다.
때문에 STATICFILES_DIR과 다르게 MEDIAFILES_DIRS 설정은 없다.

(1) HttpRequest.FILES를 통해 파일 전달
(2) 뷰 로직이나 폼 로직을 통해 유효성 검증을 수행하고,
(3) FileFiled/ImageField 필드에 "경로(문자열)"를 저장하고,
(4) settings.MEDIA_ROOT 경로에 파일을 저장한다.

3.Media 파일 경로 설정

◽ MEDIA_URL : 각 media 파일에 대한 URL Prefix. 필드명. url 속성에 의해서 참조되는 설정.
◽ MEDIA_ROOT : 파일필드를 통한 저장 시에, 실제 파일을 저장할 ROOT 경로.

settings.py 아래와 같이 수정

...
BASE_DIR은 base.py의 위치에 따라 결정되기 때문에 
운영 서버 또는 개발 머신 어디서나 프로젝트를 구동할 수 있음.
따라서 파일 경로 관련해서는 절대 하드코딩을 하지말자.
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...

MEDIA_URL = '/media/'		# ex) /media/photo1.png
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

“STATICFILES_DIRS는 있는데 왜 MEDIAFILES_DIRS 설정은 없죠?”
Static의 경우 개발하며 직접적으로 관리해주어야 하는 파일이지만,

Media 파일은 웹사이트 이용자가 올리는 파일이기 때문에
App 차원에서 직접 관리할 필요가 없습니다.

4.media에 파일 올리기

PIL(Python Image Library)의 일종, 파이썬으로 이미지들을 처리하고 싶을 때 사용합니다.

파일 올리기 위한 라이브러리 설치

pip install pillow

5.urls.py (개발환경 한정)

config\urls.py

from django.conf.urls.static import static
from django.conf import settings

MEDIA_URL로 들어오는 요청에 대해 MEDIA_ROOT 경로를 탐색한다.
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

profile
쿵스보이(얼짱뮤지션)

0개의 댓글