2010-11-24

web3ref PEP444 の実装例

PEP444 のリファレンス実装の存在を @aodag さんに教えてもらったので、見てみる、という試み。PEP444 は、PEP333 WSGI の後継仕様の提案です。まだ提案段階なので、WSGI 2.0 ではなく web3 という呼称を使っています。

読んでみたコードは、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 モジュールで定義されているテンプレート的な基底クラスを、何段階か継承しているので、ゆっくり見てみようかと。いつになるんだろ。