Django

Django Static, Media(runserver)

zhelddustmq 2024. 8. 19. 14:34

01. Static Files

02. Media Files

03. runserver

 

Static Files

  • 정적 파일(멈춰있는 파일)을 의미
  • 서비스 로직에서 별도의 처리 없이 보여주기만 하면 되는 파일
    • 서비스 이미지 파일(로고, 광고 이미지 …)
    • 자바스크립트파일, CSS 파일 등
  • 이러한 서비스 로직과 다르게 그냥 무조건 주기만 하면 되는 파일들이기 때문에 모아서 따로 제공할 수 있음

 

 

STATIC_URL

  • static 파일을 참조할 때 사용할 url
    • 개발 단계에서는 app/static 경로 및 settings의 STATICFILES_DIRS 에 정의된 경로 참조
    • 실제 디렉토리 경로가 아님에 주의 ! URL로만 존재하는 경로

STATIC_ROOT

  • 배포를 위해 정적 파일을 수집하는 디렉토리의 절대경로
  • django 프로젝트에서 사용하는 모든 정적 파일을 이곳으로 모아서 적용
    • 단, DEBUG=True 인 경우 동작 X (개발 단계임을 뜻함)
  • 추후 배포시 모든 정적파일을 다른 웹 서버가 직접 제공하기 위함(나중에 배포시 DEBUG=False로 바꿔야함)
python manage.py collectstatic
  • STATIC_ROOT에 모든 정적 파일을 수집하는 명령어
  • 배포과정에서 사용

 

각 앱의 static 디렉토리

  • <app_name>/static/<app_name>

템플릿에서 정적파일 사용하기

  • {% load static %}
  • {% static ‘file_path’ %}

진짜 사용해보기

  1. settings.py 설정 및 static 디렉토리 생성
  2. articles/static/articles 생성하고 파일 넣기



  3. index.html

 

 

CSS도 적용해보면

#  BASE_DIR/static/css/style.css

img {
  width: 200px;
}

 

base.html

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

 

 

02. Media Files

유저가 웹에서 업로드한 모든 정적 파일을 말함. (static file을 제외 모든 파일)

 

MEDIA_ROOT

  • 업로드한 파일이 저장되는 디렉토리 경로를 지정
  • 업로드 파일은 데이터베이스에 저장되지 않으며 실제 저장되는 곳의 파일의 경로

MADIA_URL

  • 미디어를 처리를 위한 URL
# settings.py

# Media files
MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"

 

 

# project app / urls

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)

개발 단계에서 MEDIA 파일 사용하는 방법

위에 코드 작성 안하면 이미지 웹페이지에서 안보여요~~~~

 

Artiles에 사진 필드 넣기

Image Field

 

Model field reference | Django documentation

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

기본적으로 FileField이지만 이미지인지 검사

  • upload_to
    • 이미지가 업로드 되는 경로를 지정
    • MEDIA_ROOT의 하위 경로를 지정

 

pillow: ImageField를 사용하기위해서는 pillow 라이브러리 설치가 필요

pip install pillow
pip freeze > requirements.txt
# DB모양이 바꼈으니까 마이그레이션하기
python manage.py makemigrations
python manage.py migrate

 

 

# create.html 수정

{% extends "base.html" %}


{% block content %}
<h1>New Article</h1>

<form action="{% url 'articles:create' %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">저장</button>
</form>
{% endblock content %}
  • form의 enctype 속성
    • form의 데이터 전송 형식을 지정하는 것으로 기본적으로는 텍스트 형식의 데이터 교환이 이루어 짐.
    • multipart/form-data
      • 전송 형식을 지정하는 것으로 file, image 전송시 사용
      • <input> 의 type=file 사용시 application/x-www-form-urlencoded 가 디폴트값
# articles/views.py 수정

@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()

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

두번째 인자로 request.FILES가 들어가는 이유

Article에 사진 넣기

 

#  article_detail.html

{% if article.image %}
		<img src="{{ article.image.url }}">
{% endif %}

image가 있는 article인 경우에 이미지 출력

03. runserver

 

  • runserver 는 ‘개발용’ 서버를 실행하는 것
  • 순수 python으로 작성되었으며 django에 포함되어있어 개발을 편하게 도와주는 역할
  • 절대로 개발 서버를 운영 환경에서 사용해서는 안됨.
    • 만약 python [manage.py](<http://manage.py>) runserver를 이용해서 배포한다면 문제 야기
    • 동시 접속 20개의 연결 정도면 서버가 터짐
  • Django는 Web Framework이며 실제 운영시에는 웹 서버를 앞쪽에 달아줘야함
  • 관련 내용은 추후 배포관련 포스터에서 다룸

 

'Django' 카테고리의 다른 글

Model Relationship (1:N)  (0) 2024.08.19
Admin  (0) 2024.08.19
회원기능 구현하기  (0) 2024.08.19
Auth  (0) 2024.08.17
URL Namespace / Templates Namespace (Django 플젝 시작 시 유의사항)  (0) 2024.08.16