やる夫で学ぶ WSGI - present の続編(?)。
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ 先日、Python の WSGI について説明した。 | } Python 以外の言語にも、WSGI みたいなものは存在する。 ヽ } たとえば Ruby なら Rack だ。 ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
____ /⌒ ⌒\ ホジホジ /( ●) (●)\ /::::::⌒(__人__)⌒::::: \ <ふーん | mj |ー'´ | \ 〈__ノ / ノ ノ
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ (ムカッ) | } Rack インタフェースの仕様はシンプルで、 ヽ } 簡単にまとめると下の通りだ。 ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
- call メソッドを持っている
- call メソッドは引数としてリクエストを受け取る
- call メソッドは次の要素を含むレスポンス(Array) を返す
- ステータスコード
- レスポンスヘッダ(Hash)
- レスポンスボディ(Array)
____ / \ / ─ ─ \ / (●) (●) \ | (__人__) | コードじゃないと分からないお \ ` ⌒´ ,/ r、 r、/ ヘ ヽヾ 三 |:l1 ヽ \>ヽ/ |` } | | ヘ lノ `'ソ | | /´ / |. | \. ィ | | | | |
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ (……コイツ!) | } 上記を満たす最小の Web アプリケーションを ヽ } 書くとしたらこんな感じだ。 ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
# coding: utf-8 # sample_app.rb class SampleApp def call(env) # env はハッシュ # HTTP リクエストの内容が格納されている method = env["REQUEST_METHOD"] # ステータスコード、レスポンスヘッダ(Hash)、レスポンスボディ(Array) # を入れた Array を返す [ 200, # ステータスコード { "Content-Type" => "text/html" }, # レスポンスヘッダ [ "<html><body>#{method} です。</body></html>" ] # レスポンスボディ ] end end
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ これだけだと Web アプリを実行できない。 | } 上記のコードを書いたファイルと同じディレクトリに、 ヽ } config.ru というファイルが必要だ。 ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
# coding: utf-8 # config.ru require './sample_app.rb' run SampleApp.new
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ あとは config.ru があるディレクトリでrackup コマンドを実行すると、 | } Web サーバーが起動して Web アプリケーションがホストされる。 ヽ } ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
_______ :/ ̄| : : ./ / # ;,; ヽ :. | ::| /⌒ ;;# ,;.;::⌒ : ::::\ : | ::|: / -==、 ' ( ●) ..:::::| ,― \ | ::::::⌒(__人__)⌒ :::::.::::| : やる夫にも Rack よくわかったお・・・ | ___) ::|: ! #;;:.. l/ニニ| .::::::/ | ___) ::| ヽ.;;;//;;.;`ー‐'ォ ..;;#:::/ | ___) ::| .>;;;;::.. ..;,.;-\ ヽ__)_/ : / \ ハァハァ....