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 というものを使ってるらしい

Jinja2 Documentation

>>> 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っぽくてよさげ