5

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()

このコードを見ると、いくつかの疑問が生じます。

  1. 関数は関数名だけでどのようにmake_server機能しますapplicationか? これが他にどのように機能し、(関数オブジェクトの)"<function application at 0x7f71686286e0>"文字列を返すかはわかりません。application.__repr__() method

  2. この関数内で使用されておらず、後で関数呼び出しで設定されていないのに、アプリケーション関数定義environが引数として定義されるのはなぜですか?application

  3. 私が理解していることから、関数定義の引数は、ここでは一種の識別子として使用され、これが関数呼び出し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) どこで使用されているか知っている人はいますか? それが私のすべての質問に答えてくれる可能性があります。

4

1 に答える 1

3

ここでの重要なPythonの概念は、関数は他のオブジェクトと同じようにオブジェクトであり、変数に割り当てることができるということです。

>>> def double(x):
...     return 2*x
...

>>> my_fn = double
>>> my_fn(4)
8

親なしで関数の名前を使用する場合、関数を呼び出すのではなく、単に関数について話しているだけです。

この行で:

server = make_server('0.0.0.0', 8080, application)

applicationは関数であり、値としてに渡しますmake_server。これは後で呼び出すことができます。これがアプリケーションの呼び出し方法です。関数に渡される値の1つはapplication、と呼ばれるさらに別の関数start_responseです。これはWSGIの作成者によって作成された関数であり、WSGIの作成者が呼び出す関数を提供します。これは、次の行で実行します。

start_response('200 OK', [('Content-Type', 'text/plain')])

関数は、従来はenvironapplicationとstart_responseと呼ばれる2つの引数を取る必要があります。environ値は使用しませんが、より複雑なWSGIアプリを使用します。WSGIフレームワークは、すべてのアプリケーション関数が2つの引数を取ることを想定しているため、常に2つの引数を使用して関数を呼び出します。したがって、2つの引数を使用して関数を定義する必要があります。そうしないと、正しく機能しません。

于 2012-07-13T13:20:48.067 に答える