∟Framework/∟Django

Django - Static & Media

최 수빈 2025. 2. 8. 22:23

 

 

Django 정적 파일 & 미디어 파일 관리

 

Static Files (정적 파일)

 

서비스 로직의 영향을 받지 않고 그대로 제공되는 파일

  • 이미지 파일 (로고, 광고 이미지 등)
  • CSS 파일( 스타일 적용)
  • JavaScript 파일 (클라이언트 측 스크립트)

 

 

Django에서 정적 파일 관리

Django는 정적 파일을 쉽게 다룰 수 있도록 기본적인 기능을 제공

/settings.py- INSTALLED_APPS django.contrib.staticfiles
STATIC_URL, STATICFILES_DIRS, STATIC_ROOT

STATIC_URL

 

정적 파일을 제공할 때 사용하는 URL 경로

  • 개발 단계에서는 app/static 폴더 또는 STATICFILES_DIRS에 지정된 경로를 참조함

*이 경로는 실제 디렉토리가 아닌 URL 경로

 

 

STATIC_ROOT

 

배포를 위해 모든 정적 파일을 모으는 디렉토리의 절대 경로

 

  • DEBUG=False인 배포 환경에서 사용됨
python manage.py collectstatic

 명령어를 실행하면 모든 정적 파일이 STATIC_ROOT 경로에 모아짐

  • DEBUG=True
  • 추후 배포시 모든 정적 파일을 다른 웹 서버가 직접 제공하기 위함

 

앱의 static 디렉토리

articles/static/articles/이미지

 

템플릿에서 정적파일 사용

articles/templates/articles/index2.html

 

BASE_DIR/static/css/style.css

BASE_DIR/static/css/style.css

 

Django 템플릿에서 정적 파일 로드

{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">

base/html
/index2/
style.css에서의 img width

 

 

 

*정적 파일 저장 구조

my_project/
│── my_app/
│   ├── static/
│   │   ├── my_app/
│   │   │   ├── css/
│   │   │   │   ├── style.css
│   │   │   ├── js/
│   │   │   │   ├── script.js
│   │   │   ├── images/
│   │   │   │   ├── logo.png
│── static/
│── templates/
│── manage.py

 

정적 파일은 앱 내부의 static 디렉토리 또는 프로젝트 전체에서 사용하는 static 디렉토리에 위치할 수 있음

 

 

 

Media Files(미디어 파일)

 

유저가 직접 업로드하는 파일(static file을 제외한 모든 파일)

변동이 있는 데이터이며, 데이터 베이스에 경로가 저장됨

 

 

Django에서 미디어 파일 관리

 

settings.py

 

MEDIA_URL

웹에서 미디어 파일을 불러올 때 사용하는 URL 경로

 

MEDIA_ROOT

업로드된 미디어 파일이 저장되는 실제 디렉토리 경로

 

 

 

URL 패턴 설정

urls.py

개발 환경에서는 DEBUG=True일 때 Django가 직접 미디어 파일을 제공할 수 있도록 설정해야 함

 

 

모델에서 ImageField 사용

articles/models.py

Django에서 이미지 파일을 업로드하려면 ImageField를 사용하며, 이를 위해 Pillow 패키지가 필요

 

  • upload_to='articles/images/'
    업로드된 파일이 MEDIA_ROOT/articles/images/에 저장됨
  • null=True, blank=True
    이미지가 없어도 저장 가능하도록 설정
    null : DB에 null 저장 가능, blank : form에서 해당 값을 입력하지 않아도 됨

imagefields

 

Model field reference | Django documentation

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

python -m pip install Pillow
pip freeze > requirements.txt

 

migration 진행

 

파일 업로드 폼 - create.html 변경

articles/templates/articles/create.html

템플릿에서 enctype="multipart/form-data" 설정이 필요함

 

 

*form의 enctype 속성

 

form의 데이터 전송 형식을 지정하는 것으로 기본적으로는 텍스트 형식의 데이터 교환이 이루어짐

 

multipart/form-data

전송 형식을 지정하는 것으로 file, image 전송시 사용

<input>의 type=file 사용 시 application/x-www-form-urlencoded가 기본값

 

articles/views.py 수정

create함수 수정

 

BaseModelForm

두번째 인자의 files=None

 

업로드된 이미지 출력 -articles/templates/articles/article_detail.html

articles/templates/articles/article_detail.html

 

 

수정된 create.html
업로드한 이미지 렌더링
ArticlesPage

 

 

 

Django 개발 서버 (runserver)의 동작 방식

 

runserver == 개발용 서버

 

Django의 runserver 명령어는 개발 환경에서만 사용해야 함

python manage.py runserver

 

runserver의 특징

  • 순수 Python으로 구현된 간이 서버
  • Django에 포함된 도구로, 개발을 편리하게 하기 위한 용도
  • 배포 환경에서는 사용하면 안 됨
  • 많은 트래픽을 처리할 수 없음
  • 동시 접속 20개 정도면 서버가 과부하될 가능성이 있음

 

배포 환경에서의 정식 웹 서버

 

운영 환경에서는 아래와 같은 웹 서버를 앞단에 배치하여 Django를 실행

  • Gunicorn (Python 기반 WSGI 서버)
  • uWSGI (WSGI 및 ASGI 지원)
  • Nginx / Apache (정적 파일 제공 및 리버스 프록시 역할)

 

*Gunicorn을 사용하여 Django 실행

gunicorn my_project.wsgi:application --bind 0.0.0.0:8000

 

Django 자체는 웹 애플리케이션 개발을 위한 프레임워크이며, 웹 서버가 아님

배포 환경에서는 반드시 별도의 웹 서버와 함께 사용

 


 

Static Files

  • CSS. JavaScript, 이미지 등 변경되지 않는 정적 파일을 의미
  • STATIC_URL, STATICFILES_DIRS, STATIC_ROOT 설정 필요
  • collectstatic 명령어로 배포용 정적 파일을 모을 수 있음

Media Files

  • 사용자가 업로드한 파일을 저장하는 방식
  • MEDIA_URL, MEDIA_ROOT 설정 필요
  • ImageField 사용 시 pillow 라이브러리 필수

Django의 runserver

  • 개발용 서버로, 운영 환경에서는 사용하지 말아야 함
  • 배포시, Gunicorn, uWSGI, Nginx 등을 조합하여 웹 서버 구성

'∟Framework > ∟Django' 카테고리의 다른 글

Django - Admin Site 활용  (1) 2025.02.13
Django - 회원기능 구현하기  (1) 2025.02.06
Django - Auth  (1) 2025.02.04
Django - URL Namespace  (0) 2025.02.02
Django - Django Form과 ModelForm을 활용한 입력 폼 처리  (0) 2025.01.31