twistedその1

やっと使い方がわかってきたのでメモ。
twistedはイベントドリブンなネットワークフレームワークとか説明されるのだが、最初は何のことか分からんわけであります。
何かすごそうな気がするのだが妙に敷居が高い(3回は習得が頓挫している)。
twistedの部品を組み合わせてfilter串を作るまでの順を追ってみることにした。

HTTPFactory

とりあえずコード。
まずはproxyにする前に通常のHTTPアクセスに応答するサーバを作る。実行してからブラウザでhttp://localhost:10080にアクセスする。

from twisted.web import http
from twisted.internet import reactor
from twisted.python import log


class MyRequest(http.Request):
    def process(self):
        self.write("Hello")
        self.finish()


if __name__=="__main__":
    import sys
    log.startLogging(sys.stdout)

    f=http.HTTPFactory()
    f.protocol.requestFactory=MyRequest

    reactor.listenTCP(10080, f)
    reactor.run()

10080ポートをリッスンしてリクエストが来たらHelloとだけ返すようにした。
ヘッダまで含めると以下のように応答する。

HTTP/1.1 200 OK
Transfer-Encoding: chunked

Hello

ちゃんとHTTP/1.1に対応しているみたいだ(proxomitronで見た)。


main部のソースの意味は最初の2行はログ出力の設定なので気にしない。
あとはFactoryを継承したクラスのオブジェクトを作って、reactorでポートを指定してListenするというtwistedの定石通りなのだが、

    f.protocol.requestFactory=MyRequest

という部分が込み入っている。この辺にtwistedのとっつき難さがあらわれている。twistedを使いこなすにはリファレンスを読むだけでは不十分で、ソースを読んで適当なクラス変数をカスタムのクラスで置き換えるというまさに上記のような使い方がどうしても必要になる。個々のソースは短いので読み易いのだが、クラスとオブジェクトが絡み合っていて混乱する。紙に呼び出し関係を書いて理解しましたとも。


その1ではHTTPFactoryでHTTPサーバを作って、中身はRequest#processで何とかするという枠組みを見た。