Responder in paradise[1] ほんとの第一歩

これの続き。

PythonでResponderというと、サンプルとして必ず出てくる

import responder

api = responder.API()

@api.route(“/”)
def nanntarakanntara(req, resp):
………

な感じのアレ。恐らくFlaskユーザへのラブレターなんだろうが、Flaskを知らないユーザはアレを見てどう思うだろう?

俺は最初「 最も重要なAPIのインスタンスがグローバルな場所に無操作に置かれている」のが嫌で、これを自前クラスの中でself.apiとした。ところがこれだと@デコレータでのルーティングができない(!)。

この時点で心折れそうになったが気を取り直して本家ドキュメントを読み、その代替手法たるadd_route()の存在を知った(たぶんfalcon伝)。そしてその結果、ルーティングにクラス内のメソッドを使えるようになった。

が、これだけだといずれクラスの肥大は免れない。そこで更に「クラスベースのルーティング」を試してみることに。やり方は簡単でadd_routeの第2引数にクラスの名前を書くだけ。これでresponder.apiのクラスと、ルーティングの対象に応じて使われるクラスとが分離されてスッキリした。

がしかし、今度は後者でapi.templateを使おうとして躓いた(分離したのだから当然だが)。暫し悩んだ後、後者をインスタンス化して__init__でapiを渡し、add_routeにはクラス名でなくそのインスタンス名を書いてみたら○。

という訳で結構苦労したが、ここまででルーティングの手法を「デコレータとメソッドで」から「add_routeと別クラスで」へとすることができた。この拘りはいずれ己を救うと信じている。以上!