読んでみたコードは、http://github.com/mcdonc/web3 です。Pyramid フレームワークの開発者だそうで。
サンプルコードとして simple_server.py というのがあります。ここで簡単な web3 アプリが定義されています。
def demo_app(environ): result = b'Hello world!' headers = [ (b'Content-Length', to_bytes(len(result))), (b'Content-Type', b'text/plain'), ] return (b'200 OK', headers, [result])
戻り値の各要素は、bytes 型、bytes 型、bytes型の配列になっています。これは PEP444 と PEP333 の違いのひとつで、web3 アプリのレスポンスは bytes 型で返すこと、となっています。ステータスコードも bytes 型です。PEP444 でもいくつか理由があげられていますが、Python 2.x 系列の str 型はそれが文字列なのかバイト列なのかが不定である、サーバにエンコーディングをさせたくない、などの理由でこうなっているとのことです。
この簡単なサンプルだけみると、Content-Type の指定なんかで、わざわざ bytes にするのってどうよ、って思いましたが、多くの場合ここには Django とか Pylons なんかのフレームワークがのっかってくるので、アプリ(web3 アプリではなくて、web サービス的な意味でのアプリケーション)で気にしなくてよいでしょう。
ちなみに、to_bytes() 関数は、
def to_bytes(data): str(data).encode('ascii')
です。
サーバとハンドラはまた今度。socketserver モジュールで定義されているテンプレート的な基底クラスを、何段階か継承しているので、ゆっくり見てみようかと。いつになるんだろ。