わかりやすい英語のWSGIとCGIとは何ですか?


126

WSGIまたはCGIを読むたびに、私はうんざりしています。私は以前にそれを読んでみましたが、実際には何も行き詰っていません。

それは本当に平易な英語で何ですか?

リクエストをターミナルにパイプして出力をリダイレクトするだけですか?


回答:


60

WSGIは、Webサーバーの開始時に、Webサーバープロセスの一部として(埋め込みモード)、または別個のプロセスとして(デーモンモード)、Pythonインタープリターを実行し、スクリプトをロードします。各リクエストにより、スクリプト内の特定の関数が呼び出され、リクエスト環境が引数として関数に渡されます。

CGIは、各要求を個別のプロセスとしてスクリプトを実行し、環境変数、stdin、およびstdoutを使用してスクリプトと「通信」します。


15
WSGI!= mod_wsgi。あなたの言語は、WSGIの実装であるmod_wsgiを意味することを示唆しています。WSGI自体は単なる仕様であり、CGIの上など、さまざまな方法で実装できます。
Graham Dumpleton、2011

@Graham:これらのモードでのWSGIアプリの実行をサポートする他のWSGIコンテナーはないと言っていますか?
Ignacio Vazquez-Abrams、

3
技術的には、少なくともプロセスがどのように開始されるか、または組み込みシステム内でコードがどのようにアクティブ化されるかという点で、これら2つよりも微妙なバリエーションがあると言えます。したがって、これら2つのカテゴリだけに物事を一般化する場合は注意が必要です。全体的なレベルでは、自分が何を持っているかを言うかもしれませんが、掘り下げたいのであれば、それだけではありません。
Graham Dumpleton、2011

1
@GrahamDumpletonは、好奇心から、CGIの上にWSGIを実装する方法を説明してもらえますか?
ヨランド

2
WSGI仕様を読んでください。これは、CGI / WSGIブリッジの例を示しています。python.org/dev/peps/pep-3333/#the-server-gateway-sideより堅牢な実装については、github.com / GrahamDumpleton / cgi2wsgiを参照してください。
Graham Dumpleton 2016

255

完全に後戻りする観点から、Blankmanは、Webサービスゲートウェイインターフェースの「紹介ページ」です。

パート1:Webサーバー

Webサーバーは応答を提供します。彼らは周りに座り、辛抱強く待っていて、突然、まったく警告なしに、突然:

  • クライアントプロセスがリクエストを送信します。クライアントプロセスは、Webサーバー、ボット、モバイルアプリなど、何でもかまいません。それは単に「クライアント」です
  • Webサーバーはこのリクエストを受信します
  • 意図的につぶやくさまざまなことが起こります(以下を参照)
  • Webサーバーが何かをクライアントに送り返す
  • ウェブサーバーは再び座っています

Webサーバー(少なくとも、より優れたサーバー)は、この点で非常に優れています。需要に応じて処理を拡大および縮小し、非常に不安定なネットワークを介して最も不安定なクライアントと確実に会話を行うため、心配する必要はありません。彼らは奉仕し続けるだけです。

これが私のポイントです。Webサーバーはまさにそのサーバーです。彼らはコンテンツについて何も知りませんし、ユーザーについても何も知りません。実際、たくさん待って確実に返信する方法以外は何も知りません。

Webサーバーの選択は、ソフトウェアではなく、配信設定を反映する必要があります。Webサーバーは、処理や論理的なものではなく、配信を担当する必要があります。

パート2:(PYTHON)ソフトウェア

ソフトウェアは周りにありません。ソフトウェアは実行時にのみ存在します。ソフトウェアは、環境の予期しない変更(ファイルが予期した場所にない、パラメーターの名前が変更されているなど)に対応できません。最適化は設計の中心的な信条である必要がありますが(もちろん)、ソフトウェア自体は最適化しません。開発者は最適化します。ソフトウェアが実行されます。ソフトウェアは、上記の「意図的なつぶやき」セクションのすべてのことを行います。何でもかまいません。

ソフトウェアの選択または設計は、Webサーバーの選択ではなく、アプリケーション、機能の選択を反映する必要があります。

ここで、言語をWebサーバーに「コンパイル」する従来の方法が困難になります。物理サーバー環境に対処するためにアプリケーションにコードを配置するか、少なくとも、実行時に含める適切な「ラッパー」ライブラリーを選択せざるを得なくなり、Webサーバー間での統一感を与えます。

WSGIとは何ですか?

では、最後に、WSGIとは何でしょうか。WSGIは 2つの部分に分けて記述された一連のルールです。それらは、統合を歓迎するあらゆる環境に統合できるように書かれています。

Webサーバー側向けに書かれた最初の部分は、「OK、WSGIアプリケーションを処理したい場合、ソフトウェアがロードされたときにソフトウェアがどのように考えているかを示します。アプリケーションで利用できるようにする必要があるものを次に示します。すべてのアプリケーションに期待できるインターフェース(レイアウト)です。さらに、何か問題が発生した場合のアプリの考え方と動作の予想方法を以下に示します。」

Pythonアプリケーションソフトウェア用に作成された2番目の部分は、「OK、WSGIサーバーを処理する場合、サーバーがユーザーに連絡したときにサーバーがどのように考えているかを示します。サーバーで使用できるようにする必要があるものを次に示します。ここにすべてのサーバーに期待できるインターフェース(レイアウト)があります。さらに、何か問題が発生した場合の動作とサーバーへの通知をここに示します。」

つまり、サーバーはサーバーになり、ソフトウェアはソフトウェアになり、一方が他方の仕様を考慮せずにうまく機能する方法です。これはWSGIです。

一方、mod_wsgiは、WSGI準拠のソフトウェアと通信できるようにするApacheのプラグインです。つまり、mod_wsgiは、Apacheでの上記のルールブックのパート1のルールの実装です。

CGIに関しては...他の人に聞いてください:-)


21
この回答を「誰かに尋ねる」で終わらせるのではなく、誰かがこの回答を編集して、同じ方法でCGIを含めるようにしてください。
Bruno Bronosky 2016

1
「サーバーはサーバーになり、ソフトウェアはソフトウェアになる」-「サーバーは火星から、ソフトウェアは金星から」:)
Rahul

22

このスペースのすべての用語が不明確で、それに直面しようとすると、それは混乱を招く頭字語を含んだものです。また、CGI対FastCGI対WSGIなどについて説明している公式のpython HOWTOの形式の優れたバックグラウンドリーダーもあります。オン。最初に読んで欲しいです。


21

CGIとWSGIはどちらも、プログラムがWebリクエストの処理に使用できる標準インターフェースを定義しています。CGIインターフェースはWSGIよりも低いレベルにあり、サーバーがHTTPリクエストからのデータを含む環境変数を設定し、プログラムが裸のHTTPサーバー応答によく似た形式で何かを返すようにします。

一方、WSGIは、Python固有のやや高レベルのインターフェースであり、プログラマーはサーバーに依存しないアプリケーションを作成でき、他のWSGIアプリケーション(ミドルウェア)でラップできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.