2010年9月28日

web3 ファーストインプレッション

PEP333 Web Server Interface Gateway の後継ともいうべき、PEP444 Web3 Interface が提案された。

Web3とはなにか?
Webアプリケーション、フレームワークと、サーバー間のインターフェイスの定義。

それはWSGIじゃないの?
Yes WSGIとWeb3の目的はほぼ同じ。Web3はWSGIをベースとしている。
なぜ、新たに提案されているかというと、WSGI提案後に、Python3がリリースされたからだ。
Python3への対応はWeb3の主要な目的のひとつだ。

なぜWSGI2.0じゃないのか?
Python3は後方互換性を保たないバージョンアップである。そのPython3に対応するWeb3も後方互換性を保つことはない。そのため、違う名前として提案している。

Python3だけが対象なのか?
現在の提案では、Python3.1以降と、2.6,2.7が対象。
2.6と2.7はPython3への架け橋であるため、Web3でも対象にしているものと思われる。
おおきな要因は、b前置詞の文字列リテラルがサポートされているかどうか。
3.0が対象じゃない理由はよく分からない。

WSGIとの大きな違いは?
一番目に付くのは、関数定義である。
WSGIの場合は第二引数にstart_responseコールバックが渡されていた。
Web3では、引数が1つだけになり、start_responseの呼び出しで渡していたレスポンスステータスやレスポンスヘッダは、戻り値のタプルに含まれるようになった。
引数がリクエストデータ、戻り値がレスポンスデータとなり、分かりやすくなったのと同時に、middlewareの作成が簡単になった。



def app(environ):
return "200 OK", [('Content-type', 'text/plain')], ["Hello, world!"]


ほかにはどのような変更が?
WSGIでは、レスポンスデータはstrとなっていた。
Python3のstrはユニコード文字列であるため、Web3のレスポンスデータはbytesにすることになっている。
ただし、2.6,7では、strでという話。
また、WSGI1.0以降のWSGI2.0に向けた提案なども含まれている。
関数シグネチャの変更もそのひとつだが、ほかにもweb3.inputのメソッドでサイズ指定可能な実装や要求されるようになったり、SCRIPT_NAME, PATH_INFO, QUERY_STRINGが省略できなくなったり、web3.script_nameやweb3.path_infoでURLデコード前の値を取得できるようになったりと、wsgiであいまいだった点などがweb3では定義されている。

ざくっと読んだおおまかな内容は以上。
まだ、わざわざWeb3と名前をかえるほどのものなのか?という疑問が消えないので、もうちょっと細かい点まで読む。