Personal tools
You are here: Home KtJ's Blog サイトをFreeBSD10+python3.3+Bottleで作り直すメモ(3)-とりあえず何か書いてみる
« November 2019 »
Su Mo Tu We Th Fr Sa
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Recent comments
Перезвоните мне пожалуйста Виктор 2019-11-18
Медкнижки в Красноярске averena24Ziply 2019-11-13
Provigil Citalopram Interaction v2yqh KennethPaida 2019-11-07
Re:oyainputをカスタマイズしよう ktj 2019-06-26
Re:oyainputをカスタマイズしよう 親指シフト最高 2019-06-26
 

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

by ktj posted at 2014-05-10 13:56 last modified 2019-11-02 12:40

とりあえずお約束の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をリスタートさせる為のフラグである。

(2019/11/2追記)これまで publish_partswriter_namehtml4css1 に設定していたが、この設定だとインラインリテラルをTT要素(HTML5では非推奨[1])に変換してあまり論理的じゃない。なんで今後は html5 にしたほうがよさそう。

[1]なお、B、U、I要素は強調要素の1バリエーションとして残った模様。理不尽だ。

(追記終わり)


Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: