Post

Django: Static & Media Files: 설정부터 활용까지

Django 프로젝트에서 정적 파일과 미디어 파일을 설정하고 활용하는 방법을 다룹니다.

Django: Static & Media Files: 설정부터 활용까지

01. Static Files

Static Files란?

  • 정적 파일은 서비스 로직에서 별도의 처리 없이 클라이언트에 제공되는 파일을 의미합니다.
    • 예: 서비스 이미지 파일(로고, 광고 이미지 등), 자바스크립트 파일, CSS 파일
  • 동적인 데이터 처리 없이 제공되기 때문에 이러한 파일들을 모아 한곳에서 관리할 수 있습니다.

Django에서 Static Files

Django는 정적 파일 관리 기능을 기본적으로 제공합니다.

STATIC_URL

  • 정적 파일을 참조할 때 사용할 URL 경로를 정의합니다.
  • 개발 단계에서는 app/static 디렉토리와 settings.pySTATICFILES_DIRS에 정의된 경로를 참조합니다.
  • 실제 파일 경로가 아닌 URL 경로로만 존재합니다.

STATIC_ROOT

  • 배포 시 정적 파일을 수집할 디렉토리의 절대경로를 설정합니다.
  • 모든 정적 파일을 이 디렉토리로 모아 웹 서버에서 제공할 수 있게 합니다.
  • DEBUG=True인 개발 단계에서는 동작하지 않습니다.

정적 파일 수집하기: collectstatic

1
python manage.py collectstatic
  • STATIC_ROOT에 모든 정적 파일을 복사합니다.
  • 배포 과정에서 사용합니다.

정적 파일 디렉토리 구조

  • 각 앱 별로 static 디렉토리를 생성합니다.
    • 예: <app_name>/static/<app_name>

템플릿에서 정적 파일 참조

  • {% load static %}: 템플릿에서 정적 파일 태그를 로드합니다.
  • {% static 'file_path' %}: 정적 파일의 경로를 가져옵니다.

정적 파일 설정 예시

  1. settings.py에 다음 내용을 추가합니다:
1
2
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
  1. BASE_DIR/static/css/style.css 파일 생성:
1
2
3
img {
  width: 200px;
}
  1. base.html에 정적 파일 참조:
1
2
3
<link rel="stylesheet" href="{% static 'css/style.css' %}">

  1. 서버 실행 후 확인:
    • 브라우저에서 개발자 도구를 열어 STATIC_URL로 설정된 경로를 확인합니다.

02. Media Files

Media Files란?

  • 사용자가 업로드한 모든 파일을 의미합니다.
    • 예: 사진, 동영상, PDF 등
  • 정적 파일과 달리 동적으로 생성되며 사용자에 의해 업로드됩니다.

Django에서 Media Files

Django는 업로드 파일을 관리하기 위해 MEDIA_URLMEDIA_ROOT를 제공합니다.

MEDIA_ROOT

  • 업로드된 파일이 저장될 디렉토리 경로를 설정합니다.
  • 데이터베이스에는 파일 경로만 저장되며 실제 파일은 이 경로에 저장됩니다.

MEDIA_URL

  • 미디어 파일에 접근할 URL 경로를 설정합니다.

settings.py 설정 예시

1
2
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

urls.py 설정

개발 단계에서 미디어 파일 제공을 위해 urlpatterns에 다음 내용을 추가합니다:

1
2
3
4
5
from django.conf import settings
from django.conf.urls.static import static

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

모델에 ImageField 추가

  1. pillow 설치:
1
pip install pillow
  1. 모델 정의:
1
2
3
4
5
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to='articles/')
  1. 마이그레이션 적용:
1
2
python manage.py makemigrations
python manage.py migrate

템플릿에서 업로드된 파일 표시

  • article_detail.html:
1
2
3
4
5
{% if article.image %}
    <img src="{{ article.image.url }}">
{% endif %}

폼에서 파일 업로드 지원

  • create.html:
1
2
3
4
5
6
7
<form action="{% url 'articles:create' %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">저장</button>
</form>

  • views.py:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.shortcuts import render, redirect
from .forms import ArticleForm

@login_required
def create(request):
    if request.method == "POST":
        form = ArticleForm(request.POST, request.FILES)
        if form.is_valid():
            article = form.save()
            return redirect("articles:article_detail", article.id)
    else:
        form = ArticleForm()

    return render(request, "articles/create.html", {"form": form})

03. runserver의 비밀

runserver는 개발용 서버

  • runserver는 Django에서 제공하는 개발용 서버로, 간단한 테스트를 위해 사용됩니다.
  • Python으로 작성되었으며 동시 접속 요청 처리 능력이 제한적입니다.
  • 운영 환경에서는 runserver를 사용하면 안 됩니다.
    • 동시 접속 20개의 요청만 처리해도 서버가 터질 수 있습니다.

운영 환경에서의 배포

  • Django는 Web Framework로, 실제 운영 환경에서는 별도의 웹 서버(Nginx, Apache 등)가 필요합니다.
  • 운영 환경에 대한 내용은 추후 배포 섹션에서 다룰 예정입니다.

주의 사항

  • 개발 단계에서는 DEBUG=True 상태로 runserver를 사용해 테스트합니다.
  • 배포 시에는 DEBUG=False로 설정하고 웹 서버를 구성해야 합니다.
This post is licensed under CC BY 4.0 by the author.