WSGIのアプリケーションってそういうことだったのか! c-bataさんのPyCon JP 2016トークを見始めました (original) (raw)

はじめに

あれ?かすみん、ライブキャンセル界隈? nikkieです(えいがさき観た)

先日uWSGIを扱った記事を書いた際に、「WSGIをあまり分かってないな〜」と感じました。

そこでc-bataさんのPyCon JP 2016登壇アーカイブを見始めました(現在も視聴中です)。
ごくごく小さな学びの一歩をアウトプットします。

目次

PyCon JP 2016「基礎から学ぶWebアプリケーションフレームワークの作り方」

スライドはリンク切れですが、リポジトリからソースのMarkdownを確認できました(slides/slide.md)

c-bataさんは後年、『実践Django』を書かれています1

WSGIを実装した最小限のアプリケーションを動かす

めちゃめちゃ小さい点なのですが、これまでFlask・FastAPI・Djangoを使ってきた経験の裏にあるものが分かって、私は興奮しました!

最小限のアプリケーション(hello.py)

def application(environ, start_response): start_response("200 OK", [("Content-type", "text/plain; charset=utf-8")]) return [b"Hello, world"]

% gunicorn -w 1 hello:application

http://127.0.0.1:8000 にブラウザでアクセスすると

最小限のアプリケーションをgunicornで動かせました

PEP 3333 紐解きメモ

この機にPEP 3333に手を伸ばします。
通読はしていませんが、c-bataさんのトークのおかげで読めそうと感じるところが多かったです。

Specification Overviewより

WSGIには2つの面2

Specification Detailsより

hello.pyの最小限アプリケーションは、この仕様を実装しているわけですね。
だから、WSGIに則っている任意のサーバで動かせる!

クラスを導入!

application_オブジェクト_なので、**呼び出せるインスタンス**でも構いません!
トークでも途中でクラスに変換します。
__call__()を実装すれば、そのクラスのインスタンスは呼び出せます3

class App: def call(self, environ, start_response): start_response( "200 OK", [("Content-type", "text/plain; charset=utf-8")] ) return [b"Hello world from app"]

app = App()

ここでFlaskやFastAPIでappインスタンス化する意味が分かった気がしました(完全に理解した感覚なので、誤解している可能性はあります)

% gunicorn -w 1 hello:app

http://127.0.0.1:8000/ をブラウザで開くと「Hello world from app」が見えました!

終わりに

c-bataさんのPyCon JP 2016のトークを見始めました。
WSGIを実装した最小限のアプリケーションを、(WSGIを実装した)サーバ(gunicorn)で動かせました。
Hello worldしかしていませんが、「これまで使ってきたWebフレームワークはみなWSGIに則っていたんだなあ」としみじみ感じました。
Webフレームワークを作るという経験から気づけた感覚です。

PyCon JPでの発表経験があるPython使いとしては、2016年のc-bataさんのトークは技術的な卓越性に驚嘆します。
私自身の持ち味もあるので単純に比較はできないと思いますが、「昔はよかった」と回顧ばかりされないためにもこのトークを超えていく気概で1回1回やっていきたいですね

おまけ:今の理解のhello.py(型ヒントを書いてみた)