python内蔵倉庫wsgirefの使用(WSGI基礎入門)


WSGI基本原理
1.WSGI処理過程
  • ブラウザからWSGI Server:ブラウザからの要求はWSGI Serverに先着します。
  • environ:WSGI ServerはHTTP要求のパラメータなどの情報をenviron(辞書1つ)にパッケージします。
  • WSGI ServerからWSGIアプリ:Appは私達が作成したバックグラウンドプログラムであり、URLごとに対応する入口処理関数(または他の呼び出し可能なオブジェクト)にマッピングされます。WSGI Serverはバックグラウンドアプリを呼び出すと、environとWSGI Serverの中の自分の一つのstart_を呼び出します。バックグラウンドAppにはレスポンス関数が注入された。
  • 論理処理:バックグラウンド関数(または他の呼び出し可能なオブジェクト)は、environとstart_を受信する必要があります。レスポンスは、論理処理を行った後に反復可能なオブジェクトを返します。反復可能なオブジェクトの要素はHTTP本文です。
  • WSGIアプリからWSGI Server:バックグラウンド関数の処理が完了したら、まずstart_を呼び出します。reponse関数は、HTTPステータスコード、報文ファースト情報(レスポンスヘッダ)をWSGI Serverに戻し、関数の戻り値をHTTP本文(レスポンスbody)としてWSGI Serverに返す。
  • WSGI Serverからブラウザに:WSGI Serverは、Appから得られたすべての情報を一つのレスポンスとしてカプセル化してブラウザに返す。
  • 2.WSGIの例
    wsgirefの簡単な例
    以下の例のプログラムを実行すると、ブラウザに入力してください。http://127.0.0.1:9999/先頭の任意のurlでも結果が見られます。実例プログラムの中で全てのurlは同じアプリで処理しています。実際の生産環境では異なるurlはきっと別のアプリにマッピングする必要がありますが、この部分は説明しません。
    
    # wsgiref Python      ,       wsgi      ,          
    from wsgiref.simple_server import make_server, demo_app
    
    # wsgi    socket server  
    #          url   demo_app    ,     demo_app  
    # app            ,          demo_app  , environ  、start_response  、     
    ws = make_server('127.0.0.1', 9999, demo_app)
    #     
    ws.serve_forever()
    デモソースコード
    
    def demo_app(environ,start_response):
        from io import StringIO
        stdout = StringIO()
        print("Hello world!", file=stdout)
        print(file=stdout)
        # environ     ,         
        h = sorted(environ.items())
        for k,v in h:
            print(k,'=',repr(v), file=stdout)
        # return      start_response       
        start_response("200 OK", [('Content-Type','text/plain; charset=utf-8')])
        return [stdout.getvalue().encode("utf-8")]  #        ,   byte  ,      start_response    Content-Type   
    デモアプリクラス定義の2つの方法
    
    #      :    __init__ __iter__  ,         environ start_response,           
    # make_server app          
    class ApplicationClass:
        def __init__(self, environ, start_response):
            self.e = environ
            self.sr = start_response
            
        def __iter__(self):
            from io import StringIO
            stdout = StringIO()
            print("Hello world!", file=stdout)
            print(file=stdout)
            h = sorted(self.e.items())
            for k, v in h:
                print(k, '=', repr(v), file=stdout)
            self.sr("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
            yield from [stdout.getvalue().encode("utf-8")]
            
            
    #      :  __call__  ,     environ start_response,          
    # make_server app          
    class ApplicationInstance:
        def __call__(self, environ, start_response):
            from io import StringIO
            stdout = StringIO()
            print("Hello world!", file=stdout)
            print(file=stdout)
            h = sorted(environ.items())
            for k, v in h:
                print(k, '=', repr(v), file=stdout)
            start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
            return [stdout.getvalue().encode("utf-8")]
    3.WSGIウェブサーバとアプリケーション
    WSGIウェブサーバ
  • 本質的にはTCPサーバであり、特定のポートで傍受する。
  • HTTPプロトコルをサポートしており、HTTP要求メッセージを解析することができ、HTTPプロトコルに従って応答データを報文としてカプセル化してブラウザに戻すことができます。
  • アプリケーションとのインターフェースであるurlからappへのマッピングを約束したWSGIプロトコルを実現した。
  • WSGIアプリケーション
  • WSGI契約に従う。
  • 自体は呼び出し可能なオブジェクトです。
  • start_を呼び出します。レスポンスヘッドに戻ります。
  • 本文を含む反復可能なオブジェクトを返す。
  • 以上がpython内蔵の倉庫wsgirefの使用(WSGI基礎入門)の詳細です。python wsgirefの使用に関する資料は他の関連記事に注目してください。