Hello guys!!!これは、に出力される単純な python wsgi サーバーです0.0.0.0:8080。
from wsgiref.simple_server import make_server
content = 'Hello guys!!!'
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [content]
server = make_server('0.0.0.0', 8080, application)
server.serve_forever()
このコードを見ると、いくつかの疑問が生じます。
関数は関数名だけでどのように
make_server機能しますapplicationか? これが他にどのように機能し、(関数オブジェクトの)"<function application at 0x7f71686286e0>"文字列を返すかはわかりません。application.__repr__() methodこの関数内で使用されておらず、後で関数呼び出しで設定されていないのに、アプリケーション関数定義
environが引数として定義されるのはなぜですか?application私が理解していることから、関数定義の引数は、ここでは一種の識別子として使用され、これが関数呼び出し
start_responseで後で必要になる他のプロパティを設定する関数の名前になります。make_serverその機能は標準ライブラリのどこで定義されていますか? (関連するモジュールのソースを確認しましたが、これがどこで行われているのか正確にはわかりません)
観察事項:environ関数定義で引数を変更しても、コードの動作は何も変わりませんが、引数は関数の本体start_responseと同じ名前にする必要があります。start_responseapplication
辞書であることは知ってos.environいますが、Python 標準ライブラリで呼び出されている場所が見つかりません。引数が必要であり、唯一の実行可能な最初の引数である場合、毎回environ最初の引数( ) を明示的に指定する必要がある理由がわかりません。別の引数を使用するとその動作に影響するという錯覚を与えます。environ私は「暗黙よりも明示的」-pythonポリシーを認識していますが、ここでは役に立たず、混乱していると思います。
編集
ネッドの答えのおかげで、などmake_server('0.0.0.0', 8080, application)のインスタンスを作成するソースを見て理解できるようになりました。さらに詳しく調べると、初期化メソッドが から継承されていることがわかりました。BaseServer インスタンスには、 特にインスタンス変数として と があります。関数オブジェクトは のクラス変数に格納されます。WSGIServerwsgiref.simple_server.WSGIServer((host, port), handler_class))BaseServerserver_addressRequestHandlerClassapplicationapplicationWSGIServer
applicationしかし、このクラス変数がPythonソースのどこかで使用されている場所をまだ見つけることができません。( の親クラスのクラス定義を含むすべてのモジュールを検索しましたWSGIServer) どこで使用されているか知っている人はいますか? それが私のすべての質問に答えてくれる可能性があります。