지난 포스팅에서 views.py
를 아래와 같이 정의했다.
def index(request):
return HttpResponse("<h2>안녕</h2>") 📌http 객체를 생성하고 <h2>안녕</h2>을 문자열을 넣어 반환해라
요약하자면,
127.0.0.1:8000/APP1/index
로 접속하면 index 함수를 통해 '안녕' 이 출력된 페이지로 응답하는 것이다.
views.py
파일에 모두 작성하기에는 코드의 길이가 길어지고, 지저분할 것이다. 따라서views.py
의 함수가 html 요소를 포함하는 것은 한계가 있다. 장고에서html
과 같이, 화면 구성을 담당하는 부분을template
이라 하며,template
기능을 활용하면 더 복잡하고, 많은 내용이 담긴 화면 구성을 별도로 관리할 수 있다.
template
기능을 활용하기 위해앱 디렉토리
내부에templates 디렉토리
를 생성한다.
📂ABC
📄manage.py
📄db.sqlite3
📂ABC
📄__init__.py
📄settings.py
📄urls.py
📄wsgi.py
📂APP1
📂templates 📌생성한 템플릿 디렉토리
📂migrations
📄__init__.py
📄admin.py
📄apps.py
📄models.py
📄tests.py
📄views.py
📄urls.py
이후
templates 디렉토리
내부에앱 디렉토리와 같은 이름의 디렉토리
를 생성하며, 이를 샌드위치 구조라고 한다.
📂ABC
📄manage.py
📄db.sqlite3
📂ABC
📄__init__.py
📄settings.py
📄urls.py
📄wsgi.py
📂APP1
📂templates
📂APP1 📌템플릿 디렉토리 내부에 생성된 앱 디렉토리와 같은 이름의 디렉토리
📂migrations
📄__init__.py
📄admin.py
📄apps.py
📄models.py
📄tests.py
📄views.py
📄urls.py
샌드위치 구조 가장 안쪽 디렉토리
에html 파일
을 생성한다.
📂ABC
📄manage.py
📄db.sqlite3
📂ABC
📄__init__.py
📄settings.py
📄urls.py
📄wsgi.py
📂APP1
📂templates
📂APP1
📄index.html 📌생성한 html 파일
📂migrations
📄__init__.py
📄admin.py
📄apps.py
📄models.py
📄tests.py
📄views.py
📄urls.py
index.html
파일의 내용을 작성한다.
<h2>평화로운 마을의 아침</h2>
<p>
어느 평화로운 마을의 이른 아침, 새들의 지저귐이 부드럽게 울려 퍼지며,<br>
햇살이 창문을 통해 스며들어 온 방을 환하게 밝혀줍니다.<br>
사람들은 잠에서 깨어나 하루를 시작하고, 아이들은 학교로 가는 길에 즐겁게 뛰어놉니다.<br>
마을 곳곳에서는 사람들이 서로 인사를 나누며, 작은 가게들은 아침 준비를 시작합니다. <br>
모든 것이 평온하고, 마음은 기쁨으로 가득 차 있습니다.
</p>
기존에 작성된 html 요소를 포함한
views.py
의index
함수를 html 파일을 불러오는 함수로 수정한다.
from django.shortcuts import render
from django.http import HttpResponse
def index(request): 📌변경된 index 함수
return render(request, 'APP1/index.html')
index 함수
가 기존HttpResponse
함수에서render
함수로 변경되었다.render
함수는 넘겨준 request와 templates를 토대로 응답, 즉 HttpResponse 객체를 생성해 반환하는 기능을 한다.
템플릿
,정적파일(css, font, image)
은 샌드위치 구조로 관리해야 한다. 그 이유를 알기 위해프로젝트 구성 디렉토리
의settings.py
파일을 살펴보자
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True, 📌각각의 앱에 템플릿 디렉토리가 있으니 찾으라는 설정
'OPTIONS': {
},
},
]
settings.py
의TEMPLATES
항목을 보면'APP_DIRS': True
가 있다. 이는 각각의 앱에 템플릿 디렉토리가 있으니 찾아서 사용하라는 의미다. 그렇다면 장고는 이를 어떻게 해석할까? 자세한 설명을 위해settings.py
의INSTALLED_APPS
을 살펴보자
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'APP1', 📌상단에 등록된 앱
'APP2',
]
INSTALLED_APPS
을 살펴보면APP1
과APP2
앱이 적용되어 있다. 장고는 등록된 앱 순서에 따라 하나하나index.html
파일을 찾는다. 따라서APP1
의index.html
과APP2
의index.html
중 상단에 등록된 앱의index.html
파일을 사용하게 된다. 샌드위치 구조는templates
디렉토리 내에앱 이름과 일치하는 디렉토리
를 추가함으로서 이런 문제를 방지한다.