2010년 6월 7일 월요일

05. Template

django의 동작 기반인 M-T-V의 Template에 대해 알아보겠습니다.

 

웹 프로그래밍을 하다보면 디자인과 업무 로직이 서로 엉켜있어서 개발에서부 유지/보수에 적잖은 어려움이 있습니다.

그리고 저같이 게으른 사람의 경우 처음에는 디자인과 프로그래밍 코드를 철저히 구별해 사용하다 시간이 촉박해지면 그냥 마구 잡이로 싸잡아다가 일단 동작만 되게 해 놓고 차후에 손보자고 생각하고 일을 처리하고 후일을 도모합니다만....결과는....

어쨌든 django 를 통한 개발에서도 기존의 방법대로 디자인과 Python Code를 섞어 사용할 수 있습니다만...

기본적 으로 django의 개발 철학에서는 디자인과 Python Code를 분리합니다.

디자인과 코드를 분리하여야 하는 몇가지 이유를 들어보겠습니다.

  • 코드의 재사용성을 위해 디자인과 코드는 분리되어야 합니다. 디자인과 엉켜있는 프로그래밍 코드를 재사용하는 것은 정말 복잡한 일입니다.
  • 디자인 담당자의 경우 프로그래밍 코드를 이해한다고 하더라도 완벽한 이해가 힘듭니다. 그러니 서로 엉킨 코드에서 디자인을 변경하는 것도 힘든 작업입니다. 일일이 로직 개발자와 이야기하는 것은...

 

그럼 이제 django에서 Template을 사용하는 방법에 대해 알아보겠습니다.

먼저 다음과 같이 간단한 view function이 있다고 가정해 봅시다. (디자인과 Python 코드의 혼용입니다.)

 

  1. 애플리케이션/views.py
  2. from django.http import HttpResponse
    def main_page(request) :
        output = '''
    <html>
    <head><title>%s</title></head>
    <body>
       <h1>%s</h1>
       <p>%s</p>
    </body>
    </html>
        ''' % ('Welcome!', 'My django Page', 'request...')
        return HttpResponse(output)

 

위와 같이 Python Code와 HTML이 엉켜있는 상태에서 HTML을 추가하거나 Python Code를 추가하는 것은 개발자와 디자이너 모두에게 짜증을 불러 일으킵니다.

자 위의 코드를 디자인과 분리시켜 봅시다.

먼저 위의 HTML부분을 main_templates.html로 저장하도록 하겠습니다.

저장위치는 settings.py의 TEMPLATE_DIRS 지시어가 가리키는 곳이 되겠습니다.

TEMPLATE_DIRS 지시어

Template으로 사용될 문서들이 모여있는 곳을 가리키는 지시어로 기본 설정값은 빈값입니다.

이 값을 사용하기 편한 디렉토리로 지정을 하는데 예를 들면 다음과 같이 지정할 수 있습니다.

 

  1. settings.py
  2. import os.path
  3.  
  4. TEMPLATE_DIRS = (
  5. os.path.join(os.path.dirname(__file__), 'templates'),

  6. )

 

위의 설정이 지시하는 TEMPLATE_DIRS은 프로젝트가 설치된 디레토리의 하위에 있는 templates 디렉토리에서 Template으로 사용할 파일을 찾는다는 의미입니다. 디렉토리명은 원하시는 대로 하시면 됩니다.

 

  1. main_templates.html
  2. <html>
    <head><title>{{header_title}}</title></head>
    <body>
       <h1>{{header_h1}}</h1>
       <p>{{contents}}</p>
    </body>
    </html>

 

위와 같이 Template을 만들고 이제 이 Template을 이용하여 앞선 view function을 실행시키기 위해 view function을 다음과 같이 변경해 봅시다.

 

  1. 애플리케이션/views.py
  2. from django.http import HttpResponse
  3. from django.template import Context
  4. from django.template.loader import get_template

  5. def main_page(request) :
       template = get_template('main_templates.html')

       variables = Context({

          'header_title' : 'Welcome!',

          'header_h1' : 'My django Page',

          'contents' : 'request...'})

       output = template.render(variables)
       return HttpResponse(output)

 

위의 결과를 테스트 서버를 구동시켜 (> python manage.py runserver) 확인해 보면 다음과 같습니다.

template_cap01.jpg

 

위와 같이 나오게 과정을 살펴보도록 합시다.

먼 저 우리는 Template 을 작성할 때 중괄호 두개의 쌍({{, }})으로 하여 작성한 부분이 있습니다.

이 부분이 Python Code로 부터 값을 가져올 부분이라는 것을 말해 줍니다. 중괄호 두개의 쌍 안에는 일종의 변수명이 자리잡아 View 에서 적절한 값을 연결해 줍니다.

View에서 Template으로 값을 넘기는 것으로 예제 코드에서 Context 를 이용하였습니다.

이 방법을 살펴보면 먼저 Template에서 중괄호 두개의 쌍안에 묶인 변수명은 header_title, header_h1, contents 세 개 였습니다.

이 세 개의 변수를 딕셔너리의 키로써, 화면상에 출력될 값을 딕셔너리의 값으로써 연결하여 Context의 전달인자로 전달합니다.

그 다음 render 메소드를 이용하여 사용할 template과 출력할 값을 연결하여 사용자에게 응답으로 보내질 HTML을 작성합니다(rendering).

이 렇게 작성된 HTML이 HttpResponse 객체를 통해 사용자에게 보내집니다.

말로된 설명을 보시면 이게 무슨 외계어인가 싶으실 테니 위에 작성한 소스코드와 같이 보시면서 연습해 보시면 충분히 이해 되시리라 생각됩니다.

본 글에서는 간략하게 template을 소개하고 사용하는 방법을 알아보았습니다.

실제 template을 사용하는 것은 여러 상황에 맞게 구성되어 있습니다.

계속해서 내용을 올릴테니 일단 여기서는 template이 어떻게 구현되는지 확인만 해 두시면 될 것 같습니다.

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기