[解決済み] PythonのWebフレームワーク、WSGIとCGIはどのように組み合わされるか
質問
私は
ブルーホスト
アカウントで、PythonスクリプトをCGIとして実行することができます。最もシンプルなCGIだと思います。
.htaccess
:
Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py
Pythonを使ったWebプログラミングについて調べるたびに、WSGIやほとんどのフレームワークがそれを使っていることをよく耳にします。しかし、私はそれがどのように組み合わされるのか理解できません。特に、私のWebサーバーが与えられたもの(ホストのマシンで動作するApache)であり、私が本当に弄れるものではない場合(ただし
.htaccess
コマンドを使用します)。
どのように WSGI とか、CGIとか、フレームワークとか、全部つながっているんですか?ウェブフレームワーク(たとえば web.py または CherryPy ) を私の基本的なCGI設定に加えることができますか?WSGIサポートをインストールするには?
どのように解決するのですか?
WSGI、CGI、フレームワークはどのようにつながっているのですか?
Apacheは80番ポートでリッスンします。 HTTP リクエストを受け取ります。 そして、応答する方法を見つけるためにリクエストを解析します。 Apache は応答するための多くの選択肢を持っています。 応答する一つの方法は、CGI を使ってスクリプトを実行することです。 もう一つの応答方法は、単にファイルを提供することです。
CGI の場合、Apache は環境を整え、CGI プロトコルを介してスクリプトを呼び出します。 これは標準的な Unix の Fork/Exec の状況です -- CGI サブプロセスはソケットと標準出力を含む OS 環境を受け継ぎます。 CGI サブプロセスは応答を書き、それは Apache に返され、Apache はこの応答をブラウザに送ります。
CGIは原始的で煩わしい。 ほとんどの場合、リクエストごとにサブプロセスをフォークし、サブプロセスはレスポンスの終了を示すために stdout と stderr を終了するか閉じなければならないからです。
WSGIは、CGIのデザインパターンをベースにしたインターフェースです。 それは必ずしも CGI ではない -- リクエストごとにサブプロセスを fork する必要はない。 それは CGI であることができますが、そうである必要はありません。
WSGI は、いくつかの重要な方法で CGI デザインパターンを追加しています。 それは、あなたのために HTTP リクエストヘッダを解析し、それを環境に追加します。 POST 指向の入力は、環境の中でファイルのようなオブジェクトとして提供されます。 また、レスポンスを作成する関数も提供し、多くの書式の詳細からあなたを解放します。
基本的なCGIの構成でWebフレームワーク(web.pyやcherrypyなど)を実行したい場合、何を知り、インストールし、何をする必要がありますか?
サブプロセスをフォークすると高くつくことを思い出してください。 これを回避する方法は2つあります。
-
エンベデッド
mod_wsgi
またはmod_python
はPythonをApacheの中に埋め込みます。 Apache は Django アプリケーションを直接実行します。 -
デーモン
mod_wsgi
またはmod_fastcgi
を使うと、WSGI プロトコルを使って Apache が別のデーモン (または "long-running process") と対話することができるようになります。 長時間稼働する Django プロセスを起動し、このプロセスと通信するために Apache の mod_fastcgi を設定します。
なお
mod_wsgi
は、組み込みとデーモン、どちらのモードでも動作します。
mod_fastcgi について読むと、Django では フラップ を使用して、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
関連
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Pythonで文字列を小文字にするには?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
python string splicing.join()とsplitting.split()の説明
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
python implement mysql add delete check change サンプルコード
-
Python LeNetネットワークの説明とpytorchでの実装
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] WSGIとCGIをわかりやすく言うと?