Sinatraっぽく使えるPythonの軽量フレームワークJunoを使ってみる
要: easy_install
$ sudo easy_install SQLAlchemy $ sudo easy_install Jinja2 $ sudo easy_install Mako $ sudo easy_install Werkzeug $ sudo easy_install Juno
Hello Juno!
とりあえず動かしてみる
myapp.py
#!/usr/local/python # encoding:utf-8 from juno import * @route('/') def index(web): return 'Juno says hi' @route('/hello') def index(web): return 'Hello!' run()
$ python myapp.py running Juno development server, <C-c> to exit... connect to 127.0.0.1:8000 to use your app...
http://localhost:8000/にアクセス
Juno says hi なんて言われると成功
動かない場合はJunoのインストールに失敗してないかをチェック
http://localhost:8000/hello でHelloと表示されれば引数の受け渡しに成功
Template
内部で jinja2 というものを使ってるらしい
>>> from jinja2 import Template >>> template = Template('Hello {{ name }}!') >>> template.render(name='John Doe') u'Hello John Doe!'
結構簡単そう
たぶん実際に使うとなるとこっちを読むことになるが...
Jinja2 Documentation
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"> <head> <title>My Webpage</title> </head> <body> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> <h1>My Webpage</h1> {{ a_variable }} </body> </html>
Django互換らしい。
ファイル構成
proj/ - myapp.py - templates/ - index.html
こんな感じで
index.html
<html> <body> <h1>Webpage</h1> <ul> {% for item in items %} <li> {{ item }}</li> {% endfor %} </ul> {{ name }} </body> </html>
myapp.py
... @route("/param/:name") def your_name(web, name): items = ["a","b","日本語"] return template("index.html", { "name": name, "items":items })
エンコーディングを指定しておくとマルチバイト文字も通った
利点
templateに対してindex.htmlと要素名を適合させたdictのオブジェクトを渡せば簡単に使える
この記事書く過程でweb.pyも気になったのだけど、GoogleAppEngineでちょっと使った感じ、こっちのほうがsinatraっぽくてよさげ