Django: 요청과 응답, 그리고 템플릿 시스템의 이해
MVT 패턴을 통해 Django의 기본 원리를 익히고, 템플릿을 활용하여 효율적인 웹 페이지를 만드는 방법
01. 요청과 응답
MVT 패턴 실습하기
Django의 MVT 패턴에서 요청(Request)과 응답(Response)의 흐름을 직접 실습해봅시다.
Django 요청-응답 흐름
- 클라이언트의 요청(Request)이 들어옵니다.
urls.py
에서 URL 패턴과 요청을 매칭합니다.- 매칭된 URL 패턴에 따라 지정된 뷰(views.py)로 요청이 전달됩니다.
- 뷰에서 요청을 처리하고 응답(Response)을 생성합니다.
- 클라이언트에게 응답을 반환합니다.
이 과정에서 각 파트의 역할을 이해하고 협력하는 과정을 익히는 것이 중요합니다.
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
- 브라우저에서 http://127.0.0.1:8000/index/에 접속하면 응답 화면이 출력됩니다.
출력 결과
“Hello, Django!”라는 메시지가 브라우저에 표시됩니다. 이는 요청이 URL 매칭, 뷰 처리, 응답 반환의 과정을 거쳐 성공적으로 처리되었음을 의미합니다.
요청-응답 흐름 이해하기
- 클라이언트 →
HttpRequest
→urls.py
→views.py
→HttpResponse
→ 클라이언트 - 위와 같은 흐름으로 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 파일을 템플릿으로 사용합니다. 템플릿 사용법은 이후 심화 과정에서 다룹니다.
정리
- 요청은
urls.py
에서 매칭된 뷰로 전달됩니다. - 뷰는 요청을 처리하고 응답을 생성합니다.
- 간단한 응답은
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 구조가 자동으로 생성됩니다.
템플릿 렌더링 실행 흐름
작성한 코드를 실행하면 다음과 같은 요청-응답 흐름을 거칩니다:
- 클라이언트가
/
URL로 요청을 보냅니다. urls.py
에서 URL 패턴과 뷰 함수(views.py
)를 매칭합니다.- 뷰 함수에서
index.html
템플릿을 렌더링합니다. - 렌더링된 HTML을 HTTP 응답으로 반환하여 브라우저에 표시합니다.
결과 화면에는 “My First Django Project”라는 제목과 간단한 메시지가 표시됩니다.
render
함수 이해하기
Django의 render
함수는 다음과 같은 역할을 합니다:
1
render(request, template_name, context=None, content_type=None, status=None, using=None)
매개변수
request
: 클라이언트 요청 객체입니다.template_name
: 렌더링할 HTML 파일의 이름입니다.context
(선택): 템플릿에 전달할 데이터입니다.content_type
(선택): 응답의 콘텐츠 유형입니다.status
(선택): HTTP 상태 코드입니다.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
python manage.py runserver
- 브라우저에서 http://127.0.0.1:8000/users/에 접속합니다.
- “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 강의와 자료는 공식 문서를 기반으로 합니다. 문서를 읽는 습관을 들이면 개발 실력이 탄탄해집니다.
공식 문서를 활용하는 팁
- 가능하면 영어 문서를 읽으세요. 최신 정보와 정확한 표현을 이해할 수 있습니다.
- 문서를 자주 읽으며 익숙해지세요. 처음에는 어려워도 반복하다 보면 익숙해집니다.
04. Django Template System
Template이란?
Django의 Template은 데이터를 사용자에게 보여주는 데 사용되는 구조로, HTML 파일과 함께 사용됩니다.
- 기본적인 경로는
app_name/templates
입니다. - Django는
settings.py
의TEMPLATES
설정에 따라 템플릿을 찾습니다.
예제: 기본 템플릿 렌더링
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.py
의 DIRS
에 경로를 추가합니다:
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과 데이터를 결합하여 동적인 웹 페이지를 제공합니다.
- 템플릿 상속과 커스텀 템플릿 경로를 활용하면 개발 효율이 높아집니다.