템플릿에서 동적 콘텐츠 생성


Python 방명록 코드 연습 중 이 부분에서는 Jinja 템플릿을 사용하여 동적 웹 콘텐츠를 생성하는 방법을 보여줍니다.

이 페이지는 여러 페이지로 구성된 튜토리얼의 일부입니다. 처음부터 시작하고 설정 안내를 확인하려면 방명록 만들기로 이동하세요.

코드에 삽입되는 HTML은 복잡하고 유지 관리가 어렵습니다. 특수 구문을 통해 애플리케이션에서 반환된 데이터가 나타나는 위치를 지정한 상태로 별도의 파일에 HTML이 유지되는 템플릿 시스템을 사용하는 것이 낫습니다. Python에는 EZT, Cheetah, ClearSilver, Quixote, Django, Jinja2 등 수많은 템플릿 시스템을 사용할 수 있습니다. 원하는 템플릿 엔진을 애플리케이션 코드와 함께 번들로 묶어 사용할 수 있습니다.

편의를 위해 App Engine에는 Django 및 Jinja2 템플릿 엔진이 포함되어 있습니다.

Jinja2 템플릿 사용

app.yaml 파일에는 최신 버전의 jinja2가 필수 라이브러리로 나열됩니다. 프로덕션 애플리케이션은 version: latest가 아니라 실제 버전 번호를 사용해야 합니다.

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

앱이 jinja2를 가져오고 jinja2.Environment 객체를 만듭니다.

import os
import urllib

from google.appengine.api import users
from google.appengine.ext import ndb

import jinja2
import webapp2

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.autoescape'],
    autoescape=True)

MainPage 요청 핸들러의 get 메서드는 키-값 쌍 사전을 만들어 template.render에 전달합니다.

class MainPage(webapp2.RequestHandler):

    def get(self):
        guestbook_name = self.request.get('guestbook_name',
                                          DEFAULT_GUESTBOOK_NAME)
        greetings_query = Greeting.query(
            ancestor=guestbook_key(guestbook_name)).order(-Greeting.date)
        greetings = greetings_query.fetch(10)

        user = users.get_current_user()
        if user:
            url = users.create_logout_url(self.request.uri)
            url_linktext = 'Logout'
        else:
            url = users.create_login_url(self.request.uri)
            url_linktext = 'Login'

        template_values = {
            'user': user,
            'greetings': greetings,
            'guestbook_name': urllib.quote_plus(guestbook_name),
            'url': url,
            'url_linktext': url_linktext,
        }

        template = JINJA_ENVIRONMENT.get_template('index.html')
        self.response.write(template.render(template_values))

사전을 입력값으로 받는 index.html 템플릿에 따라 페이지가 렌더링됩니다.

{% for greeting in greetings %}
<div class="row">
  {% if greeting.author %}
    <b>{{ greeting.author.email }}
      {% if user and user.user_id() == greeting.author.identity %}
        (You)
      {% endif %}
    </b> wrote:
  {% else %}
    An anonymous person wrote:
  {% endif %}
  <blockquote>{{ greeting.content }}</blockquote>
</div>
{% endfor %}

JINJA_ENVIRONMENT.get_template(name) 메서드는 템플릿 파일의 이름을 사용하고 템플릿 객체를 반환합니다. template.render(template_values) 호출은 값 사전을 가져와서 렌더링된 텍스트를 반환합니다. 템플릿은 Jinja2 템플릿 구문을 사용하여 값을 액세스하고 반복하며, 해당 값의 속성을 참조할 수 있습니다.