hello twisted world

気になっていたtwistedをちょっとだけ試してみました。名前からtwitterのライブラリか何かだと思っていたのは僕だけですかそうですか。実際はネットワークライブラリで、専ら、簡単に各種プロトコルを利用したアプリケーションを実装する事ができるという噂です。

インストールはいつものeasy_installで楽々です。zope.interfaceは何故か自動でインストールされなかったので別でインストールしました。

$ easy_install zope.insterface
$ easy_install twisted

さてインストールも完了して、とっかかりが欲しい訳ですが、apiリファレンスを見てもあまりの膨大さにめまいがします。なので先ずは幾つか用意されているサンプルコードを見るのが良いかと思います。

上記のサンプルコードの中にあるエコーサーバを少しだけいじって見ました。以下がそのコードになります。ReverseEchoというのがエコーサーバの本体で、データを受け取った時の挙動をdataReceivedに記述します。ここでは受け取ったデータを反転して出力しています。残りのコードで作成したエコーサーバにポートを指定して走らせています。

from twisted.internet import reactor, protocol

class ReverseEcho(protocol.Protocol):
  def dataReceived(self, data):
    self.transport.write(data.strip()[::-1] + "\n")

if __name__ == '__main__':
  server = protocol.ServerFactory()
  server.protocol = ReverseEcho
  reactor.listenTCP(10000, server)
  reactor.run()

異様に簡単ですね。telnetを使って挙動を確認してみましょう。

$ python rev_echo.py &
$ telnet 127.0.0.1 10000
hello twisted world
dlrow detsiwt olleh

ちゃんと動いています。Cでソケット叩くとこうは行かないです。便利な世の中になりましたね。
次に「Python と Twisted できみにも書ける Web サーバ」という記事にあおられてtwisted.webを使ってみました。

先ほどのエコーサーバの様に基本的にはProtocolのサブクラスでデータの受け渡し処理を実装するようですが、メジャーなプロトコルに対しては既に専用のモジュール群が用意されていて、httpの場合はtwisted.webを使えば良さそうです。先ほどのページを元にして以下のコードを書いてみました。実質わずか4行ですが、静的ファイルしか扱えないものの立派なhttpdサーバとして動作します。

from twisted.web import static, server
from twisted.internet import reactor

DOC_ROOT = '/tmp/www/html'
PORT = 10001

res  = static.File(DOC_ROOT)
site = server.Site(res)
reactor.listenTCP(PORT, site)
reactor.run()

ドキュメントルートを/tmp/www/htmlに設定しています。適当なファイルを置いてブラウザからhttp://localhost:10001にアクセスしてみましょう。置いたファイルがブラウザで見れれば成功です。

$ mkdir -p /tmp/www/html
$ echo "hello twisted world" > /tmp/www/html/index.html
$ python static_web.py &
$ w3m http://localhost:10001

こんなに簡単にwebサーバを作り始められるとは思いませんでした。twisted恐るべしですね。サンプルコード眺めるだけでも十分面白いと思いました。

Leave a Reply

Your email address will not be published. Required fields are marked *