web-dev-qa-db-ja.com

Python Webフレームワーク、WSGIおよびCGIの組み合わせ

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

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

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

[〜#〜] wsgi [〜#〜] 、CGI、およびフレームワークはすべて接続されていますか?基本的なCGI構成でWebフレームワーク(たとえば web.py または CherryPy )を実行する場合、何を知り、インストールし、何をする必要がありますか? WSGIサポートをインストールする方法は?

148
Eli Bendersky

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. Embeddedmod_wsgiまたはmod_python embeds Python Apache内。プロセスはフォークされません。ApacheはDjangoアプリケーションを直接実行します。

  2. Daemonmod_wsgiまたはmod_fastcgiは、ApacheがWSGIプロトコルを使用して、別個のデーモン(または「長時間実行プロセス」)と対話できるようにします。長時間実行する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 runfcgi FLUPとハンドラーを統合します。

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

WSGIサポートのインストール方法

これらの指示に従ってください。

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

背景についてはこちらをご覧ください

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

237
S.Lott

Florian's answer は、特に the PEP を読んだ場合、「WSGIとは何か」に関する質問の一部に答えると思います。

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

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

CGI、FastCGI、SCGIは言語に依存しません。CGIスクリプトはPerl、Python、C、bashなど何でも作成できます。 CGIでは、URLに基​​づいてwhich実行可能ファイルが呼び出され、how呼び出されます:引数と環境を定義します。また、実行可能ファイルが終了したら、戻り値を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 など)を使用する必要があります。どちらも使用できない場合、could PEPで指定されたCGI-WSGIブリッジを使用します。

56
James Brady

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

WSGIを実行したい場合は、ホストが mod_wsgi をインストールし、適切な設定を行って自分のアプリケーションに制御を委ねる場合が最適です。

Flup は、 [〜#〜] fcgi [〜#〜][〜 #〜] scgi [〜#〜] またはAJP。私の経験から、FCGIのみが実際に機能し、Apacheで mod_fastcgi を使用するか、または別のPythonデーモンを で実行できる場合mod_proxy_fcgi

[〜#〜] wsgi [〜#〜] はCGIによく似たプロトコルであり、ウェブサーバーとPythonコードが相互作用する方法、 Pep333 として定義されているため、多くの異なるWebサーバーが同じアプリケーションプロトコルを使用して多くの異なるフレームワークとアプリケーションを使用できるようになります。

21
Florian Bösch

このスペースのすべての用語が不明確で、頭字語が混同されているものに直面した場合、公式のpython HOWTO CGI vs. FastCGI vs. WSGIなど: http://docs.python.org/howto/webservers.html

7

これはPythonの単純な抽象化レイヤーであり、Javaのサーブレット仕様と似ています。 CGIは本当に低レベルであり、プロセス環境と標準の入出力に内容をダンプするだけですが、上記の2つの仕様はhttpリクエストとレスポンスを言語の構造としてモデル化します。しかし私の印象では、Pythonたとえば、Paste)。私は間違っているかもしれませんが、私はPythonの初心者です。「Webスクリプト」コミュニティは、Java人々は、(静的にコンパイルおよびデプロイされたコードに対して、専用環境で単一のエンタープライズコンテナーを実行する)開始の贅沢を持っていました。

4
aaron