気になっていた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恐るべしですね。サンプルコード眺めるだけでも十分面白いと思いました。
関連する記事
タグ: helloworld, python, twisted

