第 9 章 アプリケーションのデプロイ 49
14.5 実習 データの取得
71 logging.info("key=%s" % str(key))
72 self.redirect('/')
73 74
75 class MyPageHandler(webapp2.RequestHandler):
76 def get(self):
77 user = users.get_current_user()
78 if user:
79 self.response.headers['Content-Type'] = 'text/plain'
80 self.response.write('Hello, ' + user.nickname())
81 else:
82 self.redirect(users.create_login_url(self.request.uri))
83 return
84 85
86 def handle_404(request, response, exception):
87 logging.exception(exception)
88 response.write('ページが見つかりませんでした。')
89 response.set_status(404)
90 91
92 app = webapp2.WSGIApplication([
93 ('/', MainHandler),
94 ('/mypage', MyPageHandler)
95 ], debug=True)
96
97 app.error_handlers[404] = handle_404
確認
入力フォーム画面で、ToDo一覧が表示されていることを確認します。
88 第14章 データストアを使う
71 logging.info("key=%s" % str(key))
72 self.redirect('/')
73 74
75 class MyPageHandler(webapp2.RequestHandler):
76 def get(self):
77 user = users.get_current_user()
78 if user:
79 self.response.headers['Content-Type'] = 'text/plain'
80 self.response.write('Hello, ' + user.nickname())
81 else:
82 self.redirect(users.create_login_url(self.request.uri))
83 return
84 85
86 def handle_404(request, response, exception):
87 logging.exception(exception)
88 response.write('ページが見つかりませんでした。')
89 response.set_status(404)
90 91
92 app = webapp2.WSGIApplication([
93 ('/', MainHandler),
94 ('/mypage', MyPageHandler)
95 ], debug=True)
96
97 app.error_handlers[404] = handle_404
確認
入力フォーム画面で、ToDo一覧が表示されていることを確認します。
88 第14章 データストアを使う
14.5 実習 データの取得
Todoフォームに登録されたデータを一覧表示しましょう。
14.5.1 確認
データが一覧表示されていることを確認します
14.5.2 解答
解答ドキュメントを参照してください。
14.5. 実習 データの取得 89
第 15 章
フォームの作成 2
15.1 テンプレートの利用
コードが埋め込まれたHTMLは乱雑でメンテナンスを難しくします。テンプレートシステムを利用するのが良 く、HTMLは別のファイルで保存して、特別な構文を使用することでアプリケーションからのデータが現れる場 所を示します。多くのPython用テンプレートシステムがあり、App EngineはDjangoとJinja2テンプレートエン ジンが利用できます。
15.1.1 Jinja2 の使い方
本書では、Jinja2テンプレートを使ってテンプレートシステムの使い方について説明します。
手順#.ライブラリの追加#. Jinja2の設定情報の追加#.テンプレートファイルの作成#.レンダリング
手順1. ライブラリの追加
アプリケーションにライブラリを追加します。最新のサポートバージョンのJinja2を利用できるようにするため、
app.yamlのlibraries項目を次のようにします。
1 libraries:
2 - name: webapp2
3 version: latest
4 - name: jinja2
5 version: latest
第 15 章
フォームの作成 2
15.1 テンプレートの利用
コードが埋め込まれたHTMLは乱雑でメンテナンスを難しくします。テンプレートシステムを利用するのが良 く、HTMLは別のファイルで保存して、特別な構文を使用することでアプリケーションからのデータが現れる場 所を示します。多くのPython用テンプレートシステムがあり、App EngineはDjangoとJinja2テンプレートエン ジンが利用できます。
15.1.1 Jinja2 の使い方
本書では、Jinja2テンプレートを使ってテンプレートシステムの使い方について説明します。
手順#.ライブラリの追加#. Jinja2の設定情報の追加#.テンプレートファイルの作成#.レンダリング
手順1. ライブラリの追加
アプリケーションにライブラリを追加します。最新のサポートバージョンのJinja2を利用できるようにするため、
app.yamlのlibraries項目を次のようにします。
1 libraries:
2 - name: webapp2
3 version: latest
4 - name: jinja2
5 version: latest
手順2. Jinja2の設定情報の追加
main.pyの先頭に、Jinja2の設定を追加します。jinja2.FileSystemLoader(os.path.dirname(__file__)) で、テンプレートファイルの保存先をmain.pyと同じ場所に指定しています。
1 import jinja2
2
3 JINJA_ENVIRONMENT = jinja2.Environment(
4 loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
5 extensions=['jinja2.ext.autoescape'],
6 autoescape=True)
手順3. テンプレートファイルの作成
index.htmlという名前でテンプレートファイルを作成し、次のような内容にします。
テンプレート構文
jinja2では{% ... %}や{{ ... }}などの制御構文が用意されています。{% .. %}はif やforなどの構文が用意され ています。{{ ... }}はpythonコードで定義された変数の内容にアクセスすることができます。
コードの説明
2行目の{% autoescape true %}では、<>などような文字を、htmlで安全に表示できるようにしてい ます。
5行目の{% for todo in todos %}はmain.pyで定義した、todosの内容を繰り返し処理しています。
1 <!DOCTYPE html>
2 {% autoescape true %}
3 <html>
4 <head lang="en">
5 <meta charset="UTF-8">
6 <title></title>
7 </head>
8 <body>
9 <h1>TODOリスト</h1>
10 11 <ul>
12 {% for todo in todos %}
13 <li>{{ todo.content }}</li>
14 {% endfor %}
15
92 第15章 フォームの作成2
16 </ul>
17
18 <form method="post" action="/">
19 <input type="text" name="content">
20 <input type="submit" value="送信" />
21 </form>
22
23 </body>
24 </html>
25 {% endautoescape %}
手順4. レンダリング
MainHandlerからWebページの出力にテンプレートを使うようにするために、次の処理を実装します
• テンプレートファイルで使用するデータを準備する – Dictionaryオブジェクトを生成する
• テンプレートファイルを指定し、レンダリング処理をする
– JINJA_ENVIRONMENT.get_template(’テンプレートファイル’)メソッドを使って、テンプ レートを読み込みます。引数にはテンプレートファイルを指定します。
– template.render(template_values)メソッドを使ってHTML文を生成します。引数に、テ ンプレートファイル側で使用するオブジェクトを指定します。
– 生成されたHTML文を書き出します
1 todos = Todo.query(Todo.author==user.nickname())
2 template_values = {
3 'todos': todos,
4 }
5
6 template = JINJA_ENVIRONMENT.get_template('index.html')
7 self.response.write(template.render(template_values))