티스토리 뷰

* 이전에 진행하면서 공부한 내용


2012/10/06 - [Mini Project/NY-School] - [NY-School] Google App Engine과 Python 시작하기전에 공부하기

2012/10/06 - [Mini Project/NY-School] - [NY-School] Google App Engine과 Python 시작하기 - Hello world

2012/10/06 - [Mini Project/NY-School] - [NY-School] Google App Engine과 Python 시작하기 - webapp framework

2012/10/07 - [Mini Project/NY-School] - [NY-School] Google App Engine과 Python 시작하기 - Datastore 사용해서 방명록 만들기


: 지난번 Datastore에 이어 이번에는 Template을 이용해서 웹언어처럼 Python을 활용하는 것을 해보자.



* Template 사용하기

: 앞서 webapp 프레임워크를 이용해서 response를 생성하는 부분을 살펴봤다. 그것을 통해 HTML의 폼 코드도 직접 Python 코드안에 넣고 생성하는 것까지 해보았다. 하지만 이렇게 HTML을 일일이 코드에 다 넣는 것은 코드를 난잡하게 만들고, 유지보수하기 어렵게 만든다. 그렇기 때문에 HTML을 별도의 파일에 저장해서 템플릿을 사용하는 것이 유용하다.


: 파이썬에서 사용할 수 있는 템플릿 시스템은 EZT, Cheetah, ClearSilver, Quixote, 그리고 Django등 다양한 프레임워크가 존재하지만, 구글 앱 엔진에는 Django 와 Jinja2를 포함하고 있으므로 Jinja2를 사용해보자.


: 일단 app.yaml에 Jinja2를 사용한다고 명시를 해야한다. 그런데 그냥 이전꺼에 이어서 실행을 하려고 하니까 구글 앱엔진의 스펙이 조금 바뀌었다. 따라서 다른 부분들도 업데이트 해주자.





: helloworld.py 맨 위에 다음과 같이 추가해서 설정을 하자.

import jinja2
import os

jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))


: 그리고 Request handler를 수정하자. 두주간 구글 앱엔진의 스펙이 바뀌었으므로, helloworld.py를 다음과 같이 바꿔주자. 바뀐 스펙은 기존의 webapp 라이브러리가 webapp2로 간단해지면서 main 함수를 지정하지 않아도 된다는 점이다.


import jinja2
import os

jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))

import cgi
import datetime
import urllib
import webapp2

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

class Greeting(db.Model):
	author = db.StringProperty()
	content = db.StringProperty(multiline=True)
	date = db.DateTimeProperty(auto_now_add=True)

def guestbook_key(guestbook_name=None):
	return db.Key.from_path('Guestbook' , guestbook_name or 'default_guestbook')

class MainPage(webapp2.RequestHandler):
	def get(self):
		guestbook_name=self.request.get('guestbook_name')
		greetings_query = Greeting.all().ancestor(guestbook_key(guestbook_name)).order('-date')
		greetings = greetings_query.fetch(10);

		if users.get_current_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 = {
			'greetings': greetings,
			'url': url,
			'url_linktext': url_linktext,
		}

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


class Guestbook(webapp2.RequestHandler):
	def post(self):
		guestbook_name = self.request.get('guestbook_name')
		greeting = Greeting(parent=guestbook_key(guestbook_name))

		if users.get_current_user():
			greeting.author = users.get_current_user().nickname()
		greeting.content = self.request.get('content')
		greeting.put()
		self.redirect('/?' + urllib.urlencode({'guestbook_name': guestbook_name}))

app = webapp2.WSGIApplication([('/' , MainPage),
	('/sign' , Guestbook)],
	debug=True)





: 그리고 템플릿인 index.html을 다음과 같이 만들어주자.



<html>
	<body>
		{% for greeting in greetings %}
			{% if greeting.author %}
				{{ greeting.author }} wrote:
			{% else %}
				An anonymous person wrote:
			{% endif %}
			
{{ greeting.content|escape }}
{% endfor %}
{{ url_linktext }} </body> </html>


: 다시 실행해보면, 다음과 같이 실행이 잘된다. 이전에 Python으로 일일이 html까지 코딩을 해야했던 지저분했던 코드와 비교해보면 상당히 깔끔해진 것을 볼 수 있다.





* 코드 분석

: 위의 helloworld.py 에서 jinja_environment_template('index.html') 은 템플릿 파일을 불러서 템플릿 객체를 생성하고, template.render(template_values)는 dictionary로 저장된 template_values를 불러서 템플릿에 넣어서 완성된 텍스트를 리턴한다. 그것을 response에다가 쓰는 것이다.


: index.html에서는 dictionary로 들어오는 변수들을 그리는 위치를 설정하며, 목록인 경우 for loop처럼 처리를 할수 있다. {% for greeting in greetings %} 는 greetings 목록에 있는 각 객체를 greeting에 할당하면서 루프를 돌겠다는 것이고, {{ greeting.author }}는 greeting 객체의 author 멤버를 출력하겠다는 것이다. 웹 언어를 해본 사람이라면 쉽게 이해가 될 것이다. {% ... %} 는 처리를 하는 부분이고, {{ }} 는 변수의 값을 바로 출력하는 것을 나타낸다. 잘 이해가 안된다면 소스보기를 통해 조금 더 이해를 도울 수 있을 것이다.



- 다음에는 Static 페이지를 사용하는 방법을 알아보자. HTML5와 Javascript, 그리고 CSS를 적용하려면 아주 중요한 내용이 될 것이다.


* Google App Engine과 Pythong을 이용해서 Template 페이지 사용하기 끝.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함