152

Python スクリプトを CGI として実行できるBluehostアカウントを持っています。実行するには、 で次を定義する必要があるため、これが最も単純な CGI だと思います.htaccess

Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py

現在、Python を使用した Web プログラミングについて調べていると、WSGI と、ほとんどのフレームワークがそれをどのように使用しているかについてよく耳にします。しかし、特に私のWebサーバーが与えられ(ホストのマシンで実行されているApache)、実際に遊ぶことができるものではない場合(.htaccessコマンドの定義を除く)、すべてがどのように組み合わされるのか理解できません。

WSGI、CGI、およびフレームワークはすべてどのように接続されていますか? 基本的な CGI 構成で Web フレームワーク ( web.pyCherryPyなど)を実行する場合、何を知って、インストールして、何をする必要がありますか? WSGI サポートをインストールするには?

4

5 に答える 5

250

WSGI、CGI、およびフレームワークはすべてどのように接続されていますか?

Apache はポート 80 でリッスンします。HTTP 要求を取得します。リクエストを解析して、応答する方法を見つけます。Apache には、応答するための多くの選択肢があります。応答する 1 つの方法は、CGI を使用してスクリプトを実行することです。応答する別の方法は、単純にファイルを提供することです。

CGI の場合、Apache は環境を準備し、CGI プロトコルを介してスクリプトを呼び出します。これは、Unix の Fork/Exec の標準的な状況です。CGI サブプロセスは、ソケットと stdout を含む OS 環境を継承します。CGI サブプロセスは、Apache に戻る応答を書き込みます。Apache はこの応答をブラウザに送信します。

CGI は原始的で面倒です。主な理由は、リクエストごとにサブプロセスをフォークし、サブプロセスが終了するか、stdout と stderr を閉じて、応答の終了を示す必要があるためです。

WSGI は、CGI デザイン パターンに基づくインターフェイスです。必ずしも CGI である必要はありません。リクエストごとにサブプロセスをフォークする必要はありません。CGI でもかまいませんが、そうである必要はありません。

WSGI は、いくつかの重要な方法で CGI 設計パターンに追加されます。HTTP リクエスト ヘッダーを解析し、これらを環境に追加します。環境内のファイルのようなオブジェクトとして、POST 指向の入力を提供します。また、応答を定式化する関数も提供するため、多くの書式設定の詳細を省くことができます。

基本的な CGI 構成で Web フレームワーク (web.py または cherrypy など) を実行したい場合、何を知る必要があるか、インストールする必要がありますか?

サブプロセスのフォークはコストがかかることを思い出してください。これを回避するには 2 つの方法があります。

  1. Python を Apache 内に埋め込むmod_wsgiか、埋め込みます。mod_pythonプロセスはフォークされません。Apache は Django アプリケーションを直接実行します。

  2. Daemon mod_wsgiまたはmod_fastcgi、WSGI プロトコルを使用して、Apache が別のデーモン (または「長時間実行プロセス」) と対話できるようにします。長時間実行される Django プロセスを開始してから、このプロセスと通信するように Apache の mod_fastcgi を構成します。

mod_wsgi組み込みまたはデーモンのいずれかのモードで動作できることに注意してください。

mod_fastcgi を読むと、Django がflupを使用して、mod_fastcgi によって提供される情報から WSGI 互換のインターフェースを作成していることがわかります。パイプラインはこのように機能します。

Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol)

Django には、さまざまなインターフェース用の「django.core.handlers」がいくつかあります。

mod_fastcgi の場合、Django はmanage.py runfcgiFLUP とハンドラーを統合する を提供します。

mod_wsgi には、このためのコア ハンドラがあります。

WSGI サポートをインストールするには?

以下の指示に従ってください。

https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki

背景については、これを参照してください

http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index

于 2009-02-06T13:04:12.723 に答える
60

Florian の回答は、特にPEPを読んだ場合、「WSGI とは」に関する質問の一部に答えていると思います。

最後にあなたが提起する質問については:

WSGI、CGI、FastCGI などはすべて、Web サーバーがコードを実行し、生成された動的コンテンツを配信するためのプロトコルです。これを、プレーンな HTML ファイルが基本的にそのままクライアントに配信される静的な Web サービスと比較してください。

CGI、FastCGI、SCGI は言語に依存しません。CGI スクリプトは、Perl、Python、C、bash などで記述できます。CGI は、URL に基づいてどの実行可能ファイルが呼び出されるか、およびその呼び出し方法(引数と環境) を定義します。また、実行可能ファイルが終了したときに戻り値を Web サーバーに返す方法も定義します。バリエーションは基本的に、より多くのリクエストを処理できるようにするための最適化であり、待ち時間を短縮するなどです。基本的なコンセプトは同じです。

WSGI は Python のみです。言語にとらわれないプロトコルではなく、標準の関数シグネチャが定義されています。

def simple_app(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

これは完全な (制限されている場合) WSGI アプリケーションです。WSGI をサポートする Web サーバー (mod_wsgi を使用する Apache など) は、リクエストが到着するたびにこの関数を呼び出すことができます。

これが非常に優れている理由は、HTTP GET/POST から CGI、Python に変換し、途中で再び元に戻すという厄介なステップを回避できるからです。これは、はるかに直接的でクリーンで効率的なリンケージです。

また、リクエストに対して実行する必要があるのが関数呼び出しだけの場合、長時間実行されるフレームワークを Web サーバーの背後で実行することがはるかに簡単になります。プレーンな CGI では、個々のリクエストごとにフレームワーク全体を起動する必要があります。

WSGI をサポートするには、WSGI モジュール ( mod_wsgiなど) をインストールするか、WSGI が組み込まれた Web サーバー ( CherryPyなど) を使用する必要があります。どちらも不可能な場合は、PEP で指定されている CGI-WSGI ブリッジを使用できます。

于 2009-02-03T00:04:46.187 に答える
21

Pep333 が例として示しているように、CGI を介して WSGI を実行できます。ただし、リクエストがあるたびに、新しい Python インタープリターが開始され、コンテキスト全体 (データベース接続など) を構築する必要があり、すべて時間がかかります。

WSGI を実行したい場合は、ホストがmod_wsgiをインストールし、適切な構成を作成してアプリケーションに制御を任せるのが最善です。

Flupは、 FCGISCGI、または AJPを使用できる Web サーバーの WSGI で実行するもう 1 つの方法です。私の経験では、FCGI だけが実際に機能し、mod_fastcgiを介して、またはmod_proxy_fcgiで別の Python デーモンを実行できる場合に、Apache で使用できます。

WSGIは CGI によく似たプロトコルであり、ウェブサーバーと Python コードがどのように相互作用するかの一連のルールを定義し、Pep333として定義されています。これにより、多くの異なる Web サーバーが、同じアプリケーション プロトコルを使用する多くの異なるフレームワークとアプリケーションを使用できるようになります。これは非常に有益であり、非常に便利です。

于 2008-10-20T16:49:17.613 に答える
8

この分野のすべての用語が不明確であり、頭字語を含んだ紛らわしい用語であることを認めておきましょう。CGI と FastCGI と WSGI などについて説明している公式の python HOWTO という形式の優れたバックグラウンド リーダーもあります。上: http://docs.python.org/howto/webservers.html

于 2012-03-29T20:04:51.330 に答える
4

これは Python の単純な抽象化レイヤーであり、Java のサーブレット仕様に似ています。CGI は非常に低レベルであり、プロセス環境と標準入出力にダンプするだけですが、上記の 2 つの仕様は http 要求と応答を言語の構造としてモデル化しています。しかし、私の印象では、Python の人々は事実上の実装に完全に落ち着いていないため、参照実装と、WSGI サポート (Paste など) とともに他のものを提供する他のユーティリティ タイプのライブラリが混在しています。もちろん、私は間違っている可能性があります。私は Python の初心者です。「Web スクリプト」コミュニティは、別の方向からこの問題に取り組んでいます (共有ホスティング、CGI レガシー、

于 2009-02-05T21:48:33.680 に答える