Post

Django: 요청과 응답, 그리고 템플릿 시스템의 이해

MVT 패턴을 통해 Django의 기본 원리를 익히고, 템플릿을 활용하여 효율적인 웹 페이지를 만드는 방법

Django: 요청과 응답, 그리고 템플릿 시스템의 이해

01. 요청과 응답

MVT 패턴 실습하기

Django의 MVT 패턴에서 요청(Request)과 응답(Response)의 흐름을 직접 실습해봅시다.

Django 요청-응답 흐름

  1. 클라이언트의 요청(Request)이 들어옵니다.
  2. urls.py에서 URL 패턴과 요청을 매칭합니다.
  3. 매칭된 URL 패턴에 따라 지정된 뷰(views.py)로 요청이 전달됩니다.
  4. 뷰에서 요청을 처리하고 응답(Response)을 생성합니다.
  5. 클라이언트에게 응답을 반환합니다.

이 과정에서 각 파트의 역할을 이해하고 협력하는 과정을 익히는 것이 중요합니다.

URL 구성하기

Django의 urls.py는 요청된 URL을 적절한 뷰로 연결하는 역할을 합니다.

urls.py 작성 예제

1
2
3
4
5
6
7
8
9
10
# my_first_pjt/my_first_pjt/urls.py

from django.contrib import admin
from django.urls import path
from articles import views

urlpatterns = [
    path("admin/", admin.site.urls),
    path("index/", views.index),
]
  • path("index/", views.index):
    • 사용자가 /index/ 경로로 요청하면 views.index 함수로 요청을 전달합니다.
  • Trailing Slash(index/) 사용: Django는 URL 패턴에서 끝에 슬래시(/)를 포함하는 것을 권장합니다. 이를 Trailing Slash라고 부릅니다.

View 작성하기

뷰는 요청을 처리하고 응답을 반환하는 역할을 합니다.

views.py 작성 예제

1
2
3
4
5
from django.http import HttpResponse

def index(request):
    response = HttpResponse("<h1>Hello, Django!</h1>")
    return response
  • HttpResponse: HTML 응답을 생성하고 반환하는 객체입니다.
  • index 함수는 /index/ 경로로 들어온 요청을 처리합니다.

서버 실행하기

작성한 코드가 제대로 동작하는지 확인하려면 서버를 실행해야 합니다.

서버 실행 명령어

1
python manage.py runserver

출력 결과

“Hello, Django!”라는 메시지가 브라우저에 표시됩니다. 이는 요청이 URL 매칭, 뷰 처리, 응답 반환의 과정을 거쳐 성공적으로 처리되었음을 의미합니다.

요청-응답 흐름 이해하기

  • 클라이언트 → HttpRequesturls.pyviews.pyHttpResponse → 클라이언트
  • 위와 같은 흐름으로 Django는 요청을 처리합니다.

💡 이 흐름을 이해하면 MVT 패턴의 작동 원리를 더 깊이 이해할 수 있습니다.

HTML 파일 사용하기

왜 HTML 파일을 사용해야 할까요?

뷰에서 HTML 코드를 직접 작성하면 코드가 복잡해지고 유지보수가 어려워집니다:

1
2
3
4
5
6
7
8
9
10
11
from django.http import HttpResponse

def index(request):
    return HttpResponse("""
                        <html>
                        <head><title>Hello</title></head>
                        <body>
                        <h1>Welcome!</h1>
                        </body>
                        </html>
                        """)

이러한 문제를 해결하기 위해 Django는 HTML 파일을 템플릿으로 사용합니다. 템플릿 사용법은 이후 심화 과정에서 다룹니다.

정리

  1. 요청은 urls.py에서 매칭된 뷰로 전달됩니다.
  2. 뷰는 요청을 처리하고 응답을 생성합니다.
  3. 간단한 응답은 HttpResponse를 사용하지만, 복잡한 HTML 구조는 템플릿 파일을 사용하는 것이 효율적입니다.

02. Django Template

HTML 파일을 작성하고 뷰로 사용하기

Django에서 HTML 파일을 사용해 템플릿을 렌더링하고 뷰로 보여주는 방법을 실습해봅시다.

템플릿 렌더링: 코드 작성

views.py 작성

1
2
3
4
5
# my_first_pjt/articles/views.py
from django.shortcuts import render

def index(request):
    return render(request, "index.html")

index.html 작성

templates 폴더를 만들고, 그 안에 index.html 파일을 생성합니다. 폴더 구조는 다음과 같습니다:

1
2
3
4
my_first_pjt/
    articles/
        templates/
            index.html
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>My First Django PJT</title>
  </head>
  <body>
    <h1>My First Django Project</h1>
    <p>My first Django project is working!</p>
  </body>
</html>

💡 TIP!

  • VScode에서 !를 입력하고 Tab을 누르면 기본 HTML 구조가 자동으로 생성됩니다.

템플릿 렌더링 실행 흐름

작성한 코드를 실행하면 다음과 같은 요청-응답 흐름을 거칩니다:

  1. 클라이언트가 / URL로 요청을 보냅니다.
  2. urls.py에서 URL 패턴과 뷰 함수(views.py)를 매칭합니다.
  3. 뷰 함수에서 index.html 템플릿을 렌더링합니다.
  4. 렌더링된 HTML을 HTTP 응답으로 반환하여 브라우저에 표시합니다.

결과 화면에는 “My First Django Project”라는 제목과 간단한 메시지가 표시됩니다.

render 함수 이해하기

Django의 render 함수는 다음과 같은 역할을 합니다:

1
render(request, template_name, context=None, content_type=None, status=None, using=None)

매개변수

  1. request: 클라이언트 요청 객체입니다.
  2. template_name: 렌더링할 HTML 파일의 이름입니다.
  3. context (선택): 템플릿에 전달할 데이터입니다.
  4. content_type (선택): 응답의 콘텐츠 유형입니다.
  5. status (선택): HTTP 상태 코드입니다.
  6. using (선택): 특정 템플릿 엔진을 지정합니다.

💡 이해 포인트: render 함수는 HTML 템플릿을 렌더링한 결과를 HttpResponse로 반환합니다.

직접 실습: users.html 생성

목표

users/ URL로 요청이 들어오면, users.html 템플릿을 렌더링하여 응답합니다.

코드 작성

1. urls.py 수정

1
2
3
4
5
6
7
# my_first_pjt/my_first_pjt/urls.py
from django.urls import path
from articles import views

urlpatterns = [
    path("users/", views.users),
]

2. views.py 수정

1
2
3
4
5
# my_first_pjt/articles/views.py
from django.shortcuts import render

def users(request):
    return render(request, "users.html")

3. users.html 작성

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Users</title>
  </head>
  <body>
    <h1>Users Page</h1>
  </body>
</html>

결과 확인

  1. 서버를 실행합니다:
1
python manage.py runserver
  1. 브라우저에서 http://127.0.0.1:8000/users/에 접속합니다.
  2. “Users Page”라는 제목이 있는 HTML 페이지가 표시됩니다.

정리

  • Django의 템플릿은 HTML 파일을 활용하여 효율적으로 응답을 생성합니다.
  • render 함수는 템플릿 파일과 데이터를 결합하여 HTTP 응답을 생성하는 핵심 도구입니다.
  • URL, 뷰, 템플릿의 협력 과정을 이해하면 Django의 기본 원리를 더 잘 활용할 수 있습니다.

03. Django 공식 문서

Django 공식 문서: 우리의 바이블

앞으로 Django를 학습하고 활용하는 과정에서 Django 공식 문서는 필수적인 참고 자료입니다. 다음 주소에서 Django의 최신 버전 문서를 확인할 수 있습니다:

1
https://docs.djangoproject.com/en/4.2/

💡 TIP: 모든 Django 강의와 자료는 공식 문서를 기반으로 합니다. 문서를 읽는 습관을 들이면 개발 실력이 탄탄해집니다.

공식 문서를 활용하는 팁

  1. 가능하면 영어 문서를 읽으세요. 최신 정보와 정확한 표현을 이해할 수 있습니다.
  2. 문서를 자주 읽으며 익숙해지세요. 처음에는 어려워도 반복하다 보면 익숙해집니다.

04. Django Template System

Template이란?

Django의 Template은 데이터를 사용자에게 보여주는 데 사용되는 구조로, HTML 파일과 함께 사용됩니다.

  • 기본적인 경로는 app_name/templates입니다.
  • Django는 settings.pyTEMPLATES 설정에 따라 템플릿을 찾습니다.

예제: 기본 템플릿 렌더링

views.py
1
2
3
4
from django.shortcuts import render

def index(request):
    return render(request, "index.html")
index.html
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>My First Django PJT</title>
  </head>
  <body>
    <h1>My First Django Project</h1>
    <p>My first Django project is working!</p>
  </body>
</html>
urls.py
1
2
3
4
5
6
from django.urls import path
from articles import views

urlpatterns = [
    path("index/", views.index),
]

Django Template Language (DTL)

1. 변수 (Variables)

템플릿에서 변수를 출력하려면 다음과 같이 작성합니다:

1
{{ variable }}
  • render() 함수에서 전달한 context 데이터를 출력합니다.
  • 예시:
1
2
3
4
5
# views.py

def greet(request):
    context = {"name": "Aiden"}
    return render(request, "greet.html", context)
1
2
<!-- greet.html -->
<h1>Hello, {{ name }}!</h1>

2. 필터 (Filters)

필터는 출력 데이터를 수정하는 데 사용됩니다:

1
{{ variable|filter }}
  • 예시:
1
{{ name|lower }} <!-- Aiden을 aiden으로 변환 -->

3. 태그 (Tags)

태그는 조건문, 반복문 등 템플릿 제어 구조를 제공합니다:

1
2
3
{% for item in items %}
  <p>{{ item }}</p>
{% endfor %}

4. 주석 (Comments)

템플릿 코드에 주석을 추가하려면 다음과 같이 작성합니다:

1
2
3
4
5
{# 한 줄 주석 #}

{% comment %}
여러 줄 주석
{% endcomment %}

Template Inheritance: 템플릿 상속

템플릿 상속은 코드 중복을 줄이고 유지보수를 쉽게 만듭니다.

1. 상위 템플릿 작성

base.html
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>{% block title %}Default Title{% endblock %}</title>
  </head>
  <body>
    <header>{% block header %}Default Header{% endblock %}</header>
    <main>{% block content %}Default Content{% endblock %}</main>
    <footer>{% block footer %}Default Footer{% endblock %}</footer>
  </body>
</html>

2. 하위 템플릿 작성

index.html
1
2
3
4
5
6
7
{% extends "base.html" %}

{% block title %}Home Page{% endblock %}

{% block content %}
<h1>Welcome to My Django Site</h1>
{% endblock %}

Custom Template Directory

공통 템플릿을 한곳에 모으고 싶다면 settings.pyDIRS에 경로를 추가합니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / "templates"],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

최상단 경로에 templates/ 디렉토리를 생성하고 공통 템플릿 파일을 저장합니다.

정리

  • Django 공식 문서는 학습의 기본 도구입니다.
  • 템플릿 시스템은 HTML과 데이터를 결합하여 동적인 웹 페이지를 제공합니다.
  • 템플릿 상속과 커스텀 템플릿 경로를 활용하면 개발 효율이 높아집니다.
This post is licensed under CC BY 4.0 by the author.