読者です 読者をやめる 読者になる 読者になる

やる夫で学ぶ WSGI

         ____    
       / \  /\ キリッ 
.     / (ー)  (ー)\       
    /   ⌒(__人__)⌒ \    <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:::| 
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::