ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

Pythonで作るWebアプリのルーティング

今のところWebApp2とDjangoの2つを触っていますが、どちらも共通した感じのルーティング設定なので、ひょっとするとWSGIのインターフェースをほぼ直にたたいているようです。
Rubyの場合Rackが表だって出てくる感じはあまりしないので、なるほどこの対比は面白いなと思いました。

以下WebApp2のルーティングについてです。

ルーティングパスの設定

Route('/path/to/content', handler='module.name.of.ContentHandler', name='handler_name')

こういうのを必要な分だけ用意して、それをリストにして WSGIApplication のコンストラクターに渡してやればいいようです。

ハンドラーの設定

上の例だと、パスのルートから
module\name\of.pyというファイルにContentHandlerというクラスを定義してやるようです。

class ContentHandler(Webapp2.RequestHandler):
    def get(self):
        # この部分はGETでリクエストすると呼ばれる
        pass

    def post(self):
        # こちらはPOSTでリクエストすると呼ばれる
        pass

ざっくりとした説明はこんな感じです。ちなみに上のコード片は何もしません。試してないけどPUTとDELETEもきくのかな

レスポンスを出力する

普通にHTMLを吐き出す

    def get(self):
        self.render('path_to_content.html', {'variable' : 'value'})

上のような感じです。ファイル名に続けてハッシュを渡すとビューで変数が使えます。

JSONを吐き出す

    def get(self):
        self.response.headers['Content-Type'] = 'application/json'
        self.response.out.write(json.dumps({ 'data': 1 }))

こんな感じで吐き出します。content-typeを書き換えるところから始まってます。ちなみに組み込みのjsonライブラリをインポートする必要があります。jsonを文字列で、しかもコントローラーで組み立てるとか考えたくないので

ステータスコードを変える

    def get(self):
        self.response.set_status(418)
        self.response.out.write('コーヒーを淹れないでください!')

こんな感じで変えられます。カフェインとるなら玉露のほうが効率がいいですよ?