____ / \ /\ キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ <Webアプリケーションフレームワーク(以下 WAF)を公開したお。 | |r┬-| | これでやる夫もギークの仲間入りだお。 \ `ー'´ / ノ \ /´ ヽ | l \ ヽ -一''''''"〜〜``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
____ /:::::::::: u\ /:::::::::⌒ 三. ⌒\ /:::::::::: ( ○)三(○)\ |::::::::::::::::⌒(__人__)⌒ | ________ \:::::::::: ` ⌒´ ,/ .| | ...| ノ::::::::::u \ | |>>1gunicornで .| /::::::::::::::::: u | | 動かねえ | |::::::::::::: l u | |>>1はクソWAF | ヽ:::::::::::: -一ー_~、⌒)^),-、 | |_________.| ヽ::::::::___,ノγ⌒ヽ)ニニ- ̄ | | |
____ / \ / _ノ ヽ、_ \ / o゚⌒ ⌒゚o \ cgi で動かすことしか考えてなかったお・・・ | (__人__) | Webサーバーに対応してまわるなんて大変だお・・・ \ ` ⌒´ /
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ WSGI をサポートすればいいだろ、常考 | } ヽ } ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
____ / \ / ─ ─\ / (●) (●) \ だぶりゅ〜えすじ〜あい? | (__人__) | / ∩ノ ⊃ / ( \ / _ノ | | .\ “ /__| | \ /___ /
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ WSGI(ウイスキー)だ。 | } Web Server Gateway Interface の略な。 ヽ } WebアプリケーションとWebサーバーとの間をつなぐ、 ヽ、.,__ __ノ 共通のインタフェースのことだ。 _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ WSGIをサポートしているWebサーバは、 | } WSGIをサポートしているWebアプリなら何でも動かせる。 ヽ } フレームワーク開発者はWSGIをサポートしておけばいい。 ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
___ / \ /ノ \ u. \ 共通のインタフェースを / (●) (●) \ サポートするなんて難しそうだお? | (__人__) u. | \ u.` ⌒´ / ノ \
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ WSGI に対応したアプリを書くのは難しくない。 | } 下は最小の WSGI アプリの例だ。 ヽ } ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
def app(env, start_response): """ 最小の WSGI アプリ。 レスポンスのボディを返す。 env HTTP リクエストが格納された辞書。 start_response 呼び出し可能オブジェクト。 start_response を使って、ステータスコードとレスポンスヘッダを出力する。 """ start_response("200 OK", [("Content-type", "text/plain")]) return "Hello world!" # Python 標準添付の WSGI サーバーでテスト if __name__ == "__main__": from wsgiref import simple_server server = simple_server.make_server("", 8080, app) server.serve_forever()
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ app 関数が WSGI アプリだ。 | } WSGI アプリは呼び出し可能なオブジェクトならなんでもいい。 ヽ } __call__ を実装したクラスのオブジェクトでもいい。 ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
class App(object): """ 最小の WSGI アプリ(その2)。 """ def __call__(self, env, start_response): """ レスポンスのボディを返す。 env HTTP リクエストが格納された辞書。 start_response 呼び出し可能オブジェクト。 start_response を使って、ステータスコードとレスポンスヘッダを出力する。 """ start_response("200 OK", [("Content-type", "text/plain")]) return "Hello world!" if __name__ == "__main__": from wsgiref import simple_server server = simple_server.make_server("", 8080, App()) server.serve_forever()
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ お前の WAF も WSGI をサポートすれば、 | } gunicorn や Apache(+mod_wsgi) で動かせるようになるぞ。 ヽ } ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
(ヽ三/) )) __ ( i))) /⌒ ⌒\ \ /( ●) (●)\ ) WSGI わかったお! ./:::::: ⌒(__人__)⌒::::\ やる夫の WAF もさっそくサポートするお! | (⌒)|r┬-| | ,┌、-、!.~〈`ー´/ _/ | | | | __ヽ、 / レレ'、ノ‐´  ̄〉 | `ー---‐一' ̄
/ ̄ ̄\ / _ノ \ | ( ●)(●) | (__人__) | ` ⌒´ノ (……まぁ、WSGI をサポートしたところで、 | } 誰もお前のクソ WAF なんて使わないだろうがな。) ヽ } ヽ、.,__ __ノ _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、 /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_ 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、 . i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::! /;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::| ;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::