2009-04-02 5 views
0

私は、apache2.2のデーモンモードでmod_wsgiを使ってDjangoをデプロイしました。だから、Djangoがコンテンツを生成した後、そこからapacheへのすべてを渡して、最適化された栄光で役立たせるか、Djangoはまだ何とかこのサービングステップに課税されていますか?mod_wsgi(デーモン)サイトはクライアントに配信するためにコンテンツをApacheに渡しますか?

答えて

3

WSGIインターフェイスでは、WSGIアプリケーション(この場合はDjango)が呼び出され、内容を返す必要があると表示されます(http://www.python.org/dev/peps/pep-0333/)。

Djangoはビュー機能を呼び出しました。あなたのビュー関数は、レンダリングされたテンプレートを返しました。 Djangoはテンプレートをレンダリングした結果を返しました。そして、あなたの代わりに、それはstart_response呼び出し可能呼び出しました。

Apacheはmod_wsgiを呼び出して別のステップを進めます。 mod_wsgi(WSGIの規則に従う)は、環境を作成し、これをDjangoに渡し、Djangoが使用できる呼び出し可能ファイルstart_responseを渡しました。

Djangoがstart_responseと呼んだとき、mod_wsgiはその応答を収集して何かをする義務がありました。 Apacheに渡してブラウザにフィードダウンします。

Djangoはかなり急いで行うことができます。しかし、Apacheは最初のページをブラウザに流し込んでしまいます。その後、ブラウザは.JSライブラリ、.CSSファイル、およびそれらのすべてのイメージを要求し始めます。理想的には、これらのフォローオン要求の残りの部分はすべてApacheが処理します。


「mod_wsgiバッファは私のためにバッファしますか?答えはバージョンによって異なります。 2.0より前のmod_wsgiはバッファを蓄積する可能性があります。 mod_wsgi 2.0以降はバッファリングしません。アプリケーションがバッファリング可能であると想定しているか、バッファリングのためにミドルウェアを含んでいます。

http://code.google.com/p/modwsgi/wiki/ChangesInVersion0200

一般的に、あなたのDjangoテンプレートは、一つのバッファにレンダリングされ、Apacheは、出力フィルタを適用し、それをブラウザにトリクルダウンするために準備ができて、1枚でのmod_wsgiに渡されます。

+0

はい。 WSGIサーバー、ゲートウェイ、およびミドルウェアは、ブロックの送信を遅延させてはならず、ブロックをクライアントに完全に送信するか、アプリケーションが実行されている間も送信を続行することを保証する必要があります次のブロックを作り出している」 –

3

mod_wsgi 1.XのFWIWでは、Apacheがデフォルトで出力バッファリングを実行できるようになっていました。これは、WSGI仕様が基本的なWebサーバーによる出力バッファリングを事実上禁止するためです。これは、WSGI仕様では、イテレート/ジェネレータから返された各文字列の後にデータがブラウザにフラッシュされる必要があるからです。

つまり、出力バッファリングを有効にすることはオプションで、何よりも多くの実験でした。それはWSGIが禁止していたために削除されました。特定のApacheバージョンで誤った動作をするためにいくつかの回避策を実装する必要がある場合、実際にmod_wsgiコードが複雑になったためです。

関連する問題