続・玩式草子 ―戯れせんとや生まれけん―

第7回 ウィスキー・ボトル・ブルース(1番)

この記事を読むのに必要な時間:およそ 4 分

テンプレート機能

今まで紹介してきたように,Bottleでは,"@route(..)"で修飾した各関数が"return(...)"で返す内容がそのURLの"コンテンツ"としてブラウザ側に送られます。

すなわち,return()で返す文字列が,HTMLファイルになるように書けばいいわけですが,長い文字列をいちいち生成するのは面倒です。

そのためBottleには,あらかじめ作成しておいたファイルを読み込んで,指定された部分のみを更新して出力するテンプレート機能が用意されています。

テンプレート用のファイルは".tpl"という拡張子を使うことになっているので,次のようなファイルを"hello.tpl"という名前で同じディレクトリに用意しておきます。

 1     <!DOCTYPE html>
 2     <html lang="ja">
 3     <head>
 4     <title>Hello {{name}}</title>
 5     </head>
 6     <body>
 7     
 8     <h1> {{mes}} {{name}} さん</h1>
 9     
10     </p>
11     </body>
12     </html>

二重の中括弧"{{...}}"はBottle固有の記法で,この部分が実行時に展開される変数であることを示します。

このテンプレートを使うためにhello.pyの方も改修します。まず,template機能を有効にするために,Bottleの各機能をimportしている4行目に"template"を追加します。そして,17行目のreturn()の中に,⁠⁠nameとmesを引数にして,hello.tplというテンプレートを呼び出す」という指示を追加しました。

加えて,名前を表示するだけだとあまりに単純すぎるので,時間帯によってメッセージを変えてみようと,Pythonのdatetimeモジュールを使って現在時刻を調べ,時間に応じたメッセージを用意することにしました。

 1     #!/usr/bin/python
 2     # -*- coding: utf-8 -*-
 3     
 4     from bottle import route, run, template
 5     from datetime import datetime
 6     
 7     @route("/hello/<name>")
 8     def greet(name):
 9         now_dt = datetime.now()
10         if now_dt.hour < 12:
11             mes = "おはようございます"
12         elif now_dt.hour < 18:
13             mes = "こんにちは"
14         else:
15             mes = "こんばんわ"
16     
17         return(template('hello', name=name, mes=mes))
18     
19     run(host='localhost', port=8080, reloader=True, debug=True)

<name>の指定にはマルチバイト文字を使うことも可能なので,"http://localhost:8080/hello/こじま" を開いてやると,ちゃんと日本語で返事を返します。

図3 テンプレート機能の例

図3 テンプレート機能の例

念のためにソースを開くと,テンプレートファイルの{{name}}と{{mes}}の部分が,引数として指定した文字列にきちんと変換されていました。

Bottleではテンプレートファイルの中でもPythonの機能が使え,行頭に"%"を付けた行は,Pythonのスクリプトとして実行されます。そこで,hello.tplを以下のように改造してみます。

7行目でdatetimeモジュールをインポート,8行目でそれを使ってnowに現在時刻を入れておき,{{name}}や{{mes}}と同じように,日付や時刻表示したい所に{{now.year}}や{{now.hour}}として用意しておきます。

 1     <!DOCTYPE html>
 2     <html lang="ja">
 3     <head>
 4     <title>Hello {{name}}</title>
 5     </head>
 6     <body>
 7     % from datetime import datetime
 8     % now = datetime.now()
 9     
10     <h1> {{mes}} {{name}} さん</h1>
11     
12     今日は {{now.year}}/{{now.month}}/{{now.day}} です。
13     <p>
14     現在時刻は {{now.hour}}:{{now.minute}}:{{now.second}} です。
15     
16     </p>
17     </body>
18     </html>

このように変更した上で,"http://localhost:8080/hello/こじま" をリロードしてみると,ちゃんと現在時刻も表示されるようになりました。

図4 テンプレートファイル中でPythonの機能を使った例

図4 テンプレートファイル中でPythonの機能を使った例

以上,Bottleの基本機能を簡単に紹介してみましたが,これだけでも結構いろんなことができそうな気がしませんか?

次回以降,Bottleの機能を紹介しつつ,簡単なWebアプリを作ってみようと考えていますので,乞御期待。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入