2014年7月8日火曜日

bottleのテンプレート機能を使う

人間、見た目が9割と言いますが…。

今回は見た目、てことでbottleのテンプレート機能を使ってみたいと思います。
ざっくり言うと、変数やコードを埋め込んだ、画面のひな形です。

早速使ってみる


まずは使ってみましょう。テンプレートファイルはbottleを実行したディレクトリ以下のviewsに置き、拡張子は*.tplとします。(static等は気にしないで下さい。前回利用したものです。)

(dev001)kitabat@clientX% pwd
/home/kitabat/dev001
(dev001)kitabat@clientX% tree work
work
├── hello.py
├── static
│   ├── css
│   │   └── default.css
│   └── img
│       └── city.jpg
└── views
    └── top.tpl

4 directories, 4 files

今回はtop.tplとしました。内容は以下の通りです。

<html>
<head><title>hoge</title></head>
<body>
message:{{message}}
</body>
</html>

4行目の{{message}}部分が変数です。ここに色々な値を与える事が出来ます。
ではいつものhello.pyに、こんなコードを書いてみましょう。

hello.py
from bottle import route, run, static_file, view
import datetime

@route('/')
@route('/<hoge>')
@view('top')
def hello(hoge="root"):
    m = "today is %s" % str( datetime.date.today().isoformat() )
    return dict(message = m)

@route('/file/<filename:path>')
def static(filename):
    return static_file(filename, root="/home/kitabat/dev001/work/static")

run(host='0.0.0.0', port=8080, debug=True, reloader=True)

前回からの変更点のみ、記載します。
まず1行目、bottleのview機能を利用する定義を追記しています。
次のimport datetimeは日時関連の処理をする為の標準ライブラリです。
ポイントは6行目。これもデコレータですね。先ほど作成したテンプレートファイルの、拡張子を除いた名前を与えます。これで、以下のhello()関数ではtop.tplテンプレートを使う、という意味になります。
8行目は今日の日付を取得しているだけです。
9行目、ここもポイントです。こんな感じで辞書型の変数をreturnする事で、テンプレートに値が渡ります。

先ほど、テンプレートファイルに書いた変数を思い出してください。{{message}}でしたね。{{ }}にはreturnで返した辞書型変数のキーを書きます。そこがバリューに置換えられます。
このようにして、今回は1つでしたが、複数のキーとバリューをテンプレートに渡す事が出来るという訳です。

アクセス結果は以下の通り。


テンプレートにコードを埋め込む


ぶっちゃけ、今回くらいの処理であれば、わざわざ値を渡さなくても、テンプレート内にpythonコードを埋め込む事で、実現出来てしまいます。
では、コードを埋め込む方法をご紹介します。

<%
        import datetime
        m = "today is %s" % str( datetime.date.today().isoformat() )
%>

<html>
<head><title>hoge</title></head>
<body>
message : {{m}}
</body>
</html>


はい、この通り、<% と %> で囲った部分にコードを書けばOKです。
あるいはコードが1行だけなのであれば、行の頭に % を付けても良いです。
テンプレート内で定義した変数であっても、HTML内で参照する場合は {{ }} で囲みます。
ではサイトにアクセスしてみて下さい。テンプレートを変更しただけですが、先程と同じ結果が得られると思います。


もう少し複雑なコード


テンプレートにコードを埋め込む際の注意点ですが、インデントは無視されます(可読性のためにインデントするのは自由です)。
ではif文など、区切りはどう表現するかというと、end というキーワードを明示的に書きます。
例えばこんな、、、。

<%
        import datetime

        hour = datetime.datetime.now().hour
        if hour > 18 or hour < 5:
                m = "good evening."
        elif hour >= 5 and hour < 10:
                m = "good morning."
        else:
                m = "hello."
        end     
%>

<html>
<head><title>hoge</title></head>
<body>
message : {{m}}
</body>
</html>

if文だけでなく、for文や関数定義等、pythonでインデントして区切りを表す部分には、終わりに必ずendを書きます。

これもhello.py側の変更は不要です(無駄な処理は残ってますが)。アクセスしてみて下さい。適切な挨拶が、なされましたか?



はい、早く寝ましょうね。では今回はこの辺で。

0 件のコメント:

コメントを投稿