01. Static Files
Static Files란?
- 정적 파일은 서비스 로직에서 별도의 처리 없이 클라이언트에 제공되는 파일을 의미합니다.
- 예: 서비스 이미지 파일(로고, 광고 이미지 등), 자바스크립트 파일, CSS 파일
- 동적인 데이터 처리 없이 제공되기 때문에 이러한 파일들을 모아 한곳에서 관리할 수 있습니다.
Django에서 Static Files
Django는 정적 파일 관리 기능을 기본적으로 제공합니다.
STATIC_URL
- 정적 파일을 참조할 때 사용할 URL 경로를 정의합니다.
- 개발 단계에서는
app/static
디렉토리와 settings.py
의 STATICFILES_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' %}
: 정적 파일의 경로를 가져옵니다.
정적 파일 설정 예시
settings.py
에 다음 내용을 추가합니다:
1
2
| STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
|
BASE_DIR/static/css/style.css
파일 생성:
1
2
3
| img {
width: 200px;
}
|
base.html
에 정적 파일 참조:
1
2
3
|
<link rel="stylesheet" href="{% static 'css/style.css' %}">
|
- 서버 실행 후 확인:
- 브라우저에서 개발자 도구를 열어
STATIC_URL
로 설정된 경로를 확인합니다.
- 사용자가 업로드한 모든 파일을 의미합니다.
- 정적 파일과 달리 동적으로 생성되며 사용자에 의해 업로드됩니다.
Django는 업로드 파일을 관리하기 위해 MEDIA_URL
과 MEDIA_ROOT
를 제공합니다.
- 업로드된 파일이 저장될 디렉토리 경로를 설정합니다.
- 데이터베이스에는 파일 경로만 저장되며 실제 파일은 이 경로에 저장됩니다.
- 미디어 파일에 접근할 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 추가
pillow
설치:
- 모델 정의:
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
2
| python manage.py makemigrations
python manage.py migrate
|
템플릿에서 업로드된 파일 표시
1
2
3
4
5
|
{% if article.image %}
<img src="{{ article.image.url }}">
{% endif %}
|
폼에서 파일 업로드 지원
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>
|
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
로 설정하고 웹 서버를 구성해야 합니다.