• 検索結果がありません。

第 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一覧が表示されていることを確認します。

8814章 データストアを使う

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一覧が表示されていることを確認します。

8814章 データストアを使う

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

9215章 フォームの作成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))