Personal tools
You are here: Home KtJ's Blog サイトをFreeBSD10+python3.3+Bottleで作り直すメモ(3)-とりあえず何か書いてみる

サイトをFreeBSD10+python3.3+Bottleで作り直すメモ(3)-とりあえず何か書いてみる

by ktj posted at 2014-05-10 13:56 last modified 2018-04-30 22:02

とりあえずお約束のHello, Worldでも。

hello.py:

# -*- coding: utf-8 -*-

from bottle import route, run, SimpleTemplate
from docutils.core import publish_parts

@route('/hello')
def hello():
  rest = '''heading
========'''
  settings = {
    'initial_header_level': 2,
    'doctitle_xform': 0,
  }
      
  DIR = '/some/where/'
  fp = open(DIR + 'header.tpl')
  header_tpl = SimpleTemplate(fp.read())
  fp.close()
  fp = open(DIR + 'footer.tpl')
  footer_tpl = SimpleTemplate(fp.read())
  fp.close

  tp = ("Hello," , "World!!!")
      
  return header_tpl.render(title='Hello World') + \
    publish_parts(rest, writer_name='html4css1', \
    settings_overrides=settings)['html_body'] + \
    footer_tpl.render(data=tp)

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

/some/where/header.tpl:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<title>{{title}}</title>
</head>
<body>
<h1>{{title}}</h1>
<hr>

/some/where/footer.tpl:

<p>
% for msg in data:
{{msg}}
% end
</p>

</body>
</html>

こういうソースを書いて、hello.pyを実行すると、localhost(うちはjail環境だから本当はlocalhost使えないけど)の8080番ポートで開発用のwebサーバが起動して、http://localhost:8080/helloにアクセスすると、下記のソースでページが表示される。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World</h1>
<hr>
<div class="document">
<div class="section" id="id1">
<h2>heading</h2>
</div>
</div>
<p>
Hello,
World!!!
</p>

</body>
</html>

hello.pyの構成はこんな感じ。

  1. Bottleのroute, run ,SimpleTemplateをインポートする
  2. docutilsのpublish_partsもインポートする
  3. @route('/hello')デコレータに続いて関数hello()を記述。関数hello()内では、
    1. 変数restにreST文書を代入
    2. 変数settingsにreST→HTML変換用のパラメータをセットする。
    3. header.tplとfooter.tplからSimpleTemplateクラスのインスタンスheader_tplとfooter_tplを生成。
    4. 関数hello()の返り値として、「header.tpl内の{{title}}を引数title='Hello Worldで置き換えたHTMLコード」「変数restをHTML文書の断片に変換したコード」「『for文で引数tpのタプルの内容を出力する』という構成のfotter.tplから得られるHTMLコード」を結合したテキストを定義。
  4. bottleのrun関数でHTTPサーバを起動。引数debugはテンプレートなりhello.pyのコードにバグがあったときにブラウザにエラー内容を表示する為のフラグで、引数reloaderはhello.pyが書き換わった時に自動的にhello.pyをリスタートさせる為のフラグである。

Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: