2008年6月7日土曜日

展覧会案内webサービスを作る(3)

Google AppEngineを使って展覧会案内葉書のデータベースサービスを作りますの続き

指定した日付の期間中に開催している展覧会案内葉書(PostCard)のデータが取得できたので、html形式に整形して表示する

htmlにする前に、表示するPostCardの数を指定できるようにする
entitys=entitys[start:start+maxcount]

Queryオブジェクトならfetch()メソッドを使う用に思うけど、既にQueryオブジェクトではなくてlistになっているので、素直にスライスを使う
このへんは処理パフォーマンス的にどうかと思うけど、どうせそんなに大きなデータを使うわけでもないので、気にしない事にする

htmlとして表示するには、
self.response.out.write(u'')

の様にhtmlをそのまま吐き出せばいい

ただプログラムでいちいちhtmlをoutputするのは面倒なので、templateを使う。
チュートリアルでもtemplateを使っているので同じようにする
template_values = {
'today':today,
'pagectrl':pagectrl,
'login':login(self),
'cards':cards,
}

path = os.path.join(os.path.dirname(__file__),'index.html')
self.response.out.write(template.render(path,template_values))
temlateはindex.htmlにtemplate_valuesに定義されたオブジェクトを埋め込んだhtml文字列を生成してくれる。
<html>
<head>
<link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
</head>
<body>
<div>{{today}}</div>
<div>{{pagectrl}}</div><div>{{login}}</div>
<a href="inputpage">入力フォーム</a><br>
<div>{{ cards }}</div>
</body>
</html>
temlateでもfor文でlistを展開したり出来る。チュートリアルでもそうなっていたけど、temlate内にプログラム的な記述を書くのがだんだん面倒になってきたので、pythonのプログラムでPostCard表示部分のhtmlを生成してcardsオブジェクトに埋め込むことにした

login処理のhtmlも同様にhtml文字列を返す関数を作った
def login(self):
user = users.get_current_user()
if user:
login = u'<b>%s: </b><a href="%s">Logout</a>' % (user.nickname(),users.create_logout_url(self.request.uri))
else:
login = u'<b>guest: </b><a href="%s">Login</a>' % (users.create_login_url(self.request.uri))
return login

0 件のコメント: