WSGIのアプリケーションってそういうことだったのか! c-bataさんのPyCon JP 2016トークを見始めました (original) (raw)
はじめに
あれ?かすみん、ライブキャンセル界隈? nikkieです(えいがさき観た)
先日uWSGIを扱った記事を書いた際に、「WSGIをあまり分かってないな〜」と感じました。
そこでc-bataさんのPyCon JP 2016登壇アーカイブを見始めました(現在も視聴中です)。
ごくごく小さな学びの一歩をアウトプットします。
目次
- はじめに
- 目次
- PyCon JP 2016「基礎から学ぶWebアプリケーションフレームワークの作り方」
- WSGIを実装した最小限のアプリケーションを動かす
- PEP 3333 紐解きメモ
- クラスを導入!
- 終わりに
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"]
- Python 3.12.6
- gunicorn (version 23.0.0)
% gunicorn -w 1 hello:application
http://127.0.0.1:8000 にブラウザでアクセスすると
最小限のアプリケーションをgunicornで動かせました!
PEP 3333 紐解きメモ
この機にPEP 3333に手を伸ばします。
通読はしていませんが、c-bataさんのトークのおかげで読めそうと感じるところが多かったです。
Specification Overviewより
- server (gatewayとも)
The server side invokes a callable object that is provided by the application side.
- 先の例だと、gunicornが渡されたapplicationを呼び出している!
- application (frameworkとも)
- 先の例だと
application()
関数
- 先の例だと
Specification Detailsより
- applicationオブジェクトは2つの位置引数
environ
とstart_response
を受け取らなければならない- 先の
application()
関数、こうなってますよね!
- 先の
environ
はPythonの組み込みの辞書start_response
は呼び出し可能オブジェクト- 3つの引数で呼び出す:
start_response(status, response_headers, exc_info=None)
- 3つの引数で呼び出す:
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(型ヒントを書いてみた)