flaskとbottleを比較する


flaskのことをいろいろ調べていたら、同じようなPythonのWebフレームワークとしてbottleというのがあることが分かりました。
WEBで見る限り、非常によく似ていたので違いを試してみました。

flask も bottle も、見た目は全く同じにすることができます。




<Pythonコード>
それぞれで使用するpythonコードは以下のようになります。
上がflask、下がbottleです。
from flask import Flask, render_template
import datetime
app = Flask(__name__)

@app.route("/")
def index():
   now = datetime.datetime.now()
   timeString = now.strftime("%Y-%m-%d %H:%M")
   templateData = {
      'title' : 'HELLO!',
      'name' : 'flask!',
      'ampm' : 1,
      'time': timeString
      }
   #./templates/sample.html
   return render_template('sample.html', **templateData)

if __name__ == "__main__":
   app.run(host='0.0.0.0', port=80, debug=True)

from bottle import route, run, view, static_file, url
import datetime

@route('/static/<filepath:path>', name='static_file')
def static(filepath):
    return static_file(filepath, root="./static")

@route('/')
@view("sample")
def index():
   now = datetime.datetime.now()
   timeString = now.strftime("%Y-%m-%d %H:%M")
   #../views/main.html
#   return template('sample', title='HELLO', name='bottle!', ampm=1, time=timeString
, url=url)
   return dict(title='HELLO', name='bottle!', ampm=1, time=timeString, url=url)

if __name__ == "__main__":
    run(host='0.0.0.0', port=8080, debug=True, reloader=True)

<テンプレートファイル>
それぞれで使用するテンプレートファイルは以下のようになります。
上がflask、下がbottleです。
<!DOCTYPE html>
   <head>
      <title>{{ title }}</title>
      <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"/>
   </head>

   <body>
      <h1>Hello, {{ name }}</h1>
{% if ampm == 0 %}
      <h2>Good Morning</h2>
      <h2>おはようございます</h2>
{% else %}
      <h2>Good Evening</h2>
      <h2>こんばんは</h2>
{% endif %}
      <h2>The date and time on the server is: {{ time }}</h2>
      <ul>
{% for no in range(10) %}
        <li>Number {{no}}</li>
{% endfor %}
      </ul>
      <img src="{{url_for('static', filename='images/smile-icon.png')}}">
   </body>
</html>

<!DOCTYPE html>
   <head>
      <title>{{ title }}</title>
      <link type="text/css" rel="stylesheet" href="{{ url('static_file', filepath='style.css') }}"/>
   </head>

   <body>
      <h1>Hello, {{ name }}</h1>
% if ampm == 0:
      <h2>Good Morning</h2>
      <h2>おはようございます</h2>
% else:
      <h2>Good Evening</h2>
      <h2>こんばんは</h2>
% end
      <h2>The date and time on the server is: {{ time }}</h2>
      <ul>
% for no in range(10):
        <li>Number {{no}}</li>
% end
      </ul>
      <img src="{{url('static_file', filepath="images/smile-icon.png")}}">
   </body>
</html>

<ディレクトリ構成>
flask
Python Code $HOME/flask/sample.py
テンプレート $HOME/flask/templates/sample.html
css $HOME/flask/static/style.css
images $HOME/flask/static/images/smile-icon.png

bottle
Python Code $HOME/bottle/sample.py
テンプレート $HOME/bottle/views/sample.html
css $HOME/bottle/static/style.css
images $HOME/bottle/static/images/smile-icon.png

<起動画面>




<日本語マニュアル>
flask
http://a2c.bitbucket.org/flask/

bottle
http://takeshid.hatenadiary.jp/entry/2015/12/15/234119


<英語チュートリアル>
flask
http://flask.pocoo.org/docs/0.11/tutorial/#tutorial

bottom
http://bottlepy.org/docs/dev/tutorial.html


少し前まではflaskはpython3に対応してなかったみたいですが、今は対応しています。
ほとんど違いが無いのですが、テンプレートファイルに渡すテンプレートデータの渡し方が、flaskのほうがスマートに思います。

bottleの決定的な違いは、テンプレート内にpythonコードを埋め込むことができます。
<!DOCTYPE html>
   <head>
      <title>{{ title }}</title>
      <link type="text/css" rel="stylesheet" href="{{ url('static_file', filepath='style.css') }}"/>
   </head>

   <body>
      <h1>Hello, {{ name }}</h1>
% if ampm == 0:
      <h2>Good Morning</h2>
      <h2>おはようございます</h2>
% else:
      <h2>Good Evening</h2>
      <h2>こんばんは</h2>
% end
      <h2>The date and time on the server is: {{ time }}</h2>
<%
import datetime
import locale
d = datetime.datetime.today()
date ='{0:d}年{1:d}月{2:d}日'.format(d.year, d.month, d.day)
%>
      <h2>date is: {{ date }}</h2>
      <ul>
% for no in range(10):
        <li>Number {{no}}</li>
% end
      </ul>
      <img src="{{url('static_file', filepath="images/smile-icon.png")}}">
   </body>
</html>




この機能はflaskにはありません。
この違いは使っているテンプレートエンジンの違いによるものです。

flaskのテンプレートエンジン
Jinja2 Template Engine

bottleのテンプレートエンジン
Simple Template Engine

ドキュメントはJinja2の方がしっかりしています。
bottleの方が一見、高機能に見えますが、ロジックと見た目(テンプレート)を分離するという点では
このような機能を持たないflaskの方が正しい実装に見えます。