1

この質問では組み合わせてはならない 2 つの概念 (WSGIHandler とミドルウェア) を組み合わせていることに気付いたので、質問を編集しました。


が何をするかについての基本的な理解を得ようとしてWSGIHandlerいます。

django.core.handlers.wsgi.py

クラス WSGIHandler(base.BaseHandler): initLock = Lock() request_class = WSGIRequest

def __call__(self, environ, start_response):

    #...

    start_response(status, response_headers)
    return response

のインスタンスはと引数WSGIHandlerで呼び出されます。のインスタンスであるオブジェクトを作成するために使用されます。environstart_response
environrequestWSGIRequest

request = self.request_class(environ)

WSGIHandler.get_responseHttpResponseからオブジェクトを作成するために使用されますrequest

response = self.get_response(request)

私の質問:
は何をしstart_responseますか? この時点で、responseオブジェクトはすでに作成されています。では、どのような反応が始まるのでしょうか? それはどこかに何らかの応答を送信しますか?そして、送信された応答はどこに送信されますreturn responseか (つまり、通常、それを呼び出すのは何ですか?)。

4

1 に答える 1

3

Web アプリを作成するcallableときは、リクエストが到着したときにサーバーが呼び出す をサーバーに提供する必要があります。この callable は、応答を生成し、応答をサーバーに送り返す役割を果たします。サーバーは、この応答をブラウザに送り返します。

django の場合、その callable はWSGIHandler. が__call__定義されているため、これ__call__はサーバーによって呼び出されます。

に送信される引数は__call__、サーバーからのものです。start_responseサーバーによって実装される呼び出し可能オブジェクトでもあります。その実装について心配する必要はありません。したがって、__call__ofWSGIHandlerはこの callableを呼び出しstart_responseます。

start_response内部的にヘッダーを作成し、後でブラウザーに送り返す必要があります。ただし、サーバーにいくつかの属性を設定するだけで、応答をブラウザーに送り返しません。どこにも応答を送信しません。

を呼び出した後start_response、wsgi ハンドラは実際の応答を行で返しますreturn response。この行が実行されると、サーバーは応答が適切かどうかをチェックし、応答に基づいて、start_response呼び出しで設定された Cookie を送信するか、何らかの例外を発生させます。

詳細については、 http://www.python.org/dev/peps/pep-0333/を確認してください。

于 2013-04-22T15:42:15.397 に答える