後で注意してください: 以下の元の投稿の問題は大部分が解決されています。
背景は次のとおりです。コンプサイエンスの入門コースでは、学生はインストラクターが提供するサーバーを使用して、html およびサーバー側の Python 2.7 スクリプトを開発します。そのサーバーは、 pointlessprogrammingのものと同様に、CGIHTTPRequestHandler に基づいています。学生の html とスクリプトが正しいと思われる場合、それらのファイルをリモートの低速の Apache サーバーに移植します。2 つのサーバーをサポートする理由 ローカル サーバーを使用した初期開発には、ネットワークの問題と、Apache を実行しているリモートの脆弱なマシンへの依存が軽減されるという利点があります。最終的に Apache を実行するマシンに移植すると、その結果を公開して他のユーザーに公開できるという利点があります。
ローカル開発を最大限に活用するには、ローカル サーバーが Apache サーバーによく似ている必要があります。現在、重要な違いがあります。Apache では、スクリプトがcontent-type
;を含むヘッダーで応答を開始する必要があります。スクリプトがそのようなヘッダーを提供できない場合、Apache はクライアントに 500 エラー (「内部サーバー エラー」) を送信します。CGIHTTPRequestHandler は同様の要件を課していません。そのため、学生がローカル サーバーで動作するヘッダーなしのスクリプトを作成することはよくあることですが、ファイルを Apache サーバーにコピーした後に不可解な 500 エラーが発生します。content-type
ヘッダーをチェックし、ヘッダーがない場合は適切なエラーを返すローカル サーバーのバージョンがあると便利です。
そのようなサーバーの作成についてアドバイスを求めます。私はPythonとサーバーの作成が初めてです。ここに私に発生する問題がありますが、役立つアドバイスをいただければ幸いです。
CGI 標準では
content-type
ヘッダーが必要ですか? もしそうなら、他の人はここでの主な質問への回答から恩恵を受けるかもしれません. また、もしそうなら、私は Apache の要件を無効にする方法を見つけることに絶望しています。おそらく、CGI RFCの関連部分はセクション 6.3.1 (CGI 応答、コンテンツ タイプ) です: 「エンティティ本体が返される場合、スクリプトは応答でコンテンツ タイプ フィールドを提供する必要があります。ヘッダーをチェックするローカル サーバーを作成するには
content-type
、おそらく CGIHTTPServer.CGIHTTPRequestHandler をサブクラス化して、run_cgi() をヘッダーの欠落に対してエラーを発行するバージョンでオーバーライドする必要があります。__version__ = "0.4"
Python 2.7.3 と共にインストールされた CGIHTTPServer.py を見ています。しかし、run_cgi() は多くの処理を行うため、ヘッダー チェック ルーチンにいくつかの呼び出しを追加するためだけに、すべてのコードをコピーするのは少し魅力的ではありません。より良い方法はありますか?(2) に対する答えが「いいえ、run_cgi() をオーバーライドすることをお勧めします」のようなものである場合、目的のスクリプトを呼び出し、その出力がクライアントに送信される前にスクリプトの出力のヘッダーをチェックするバージョンを作成する予定です。スクリプトが呼び出される既存の run_cgi() には明らかに 2 つの場所があります。
3a. Unix 以外のシステムで run_cgi() を実行すると、スクリプトは Python の
subprocess
モジュールを使用して実行されます。その結果、スクリプトからの標準出力はメモリ内の文字列として利用できるようになり、self.wfile.write
. これは正しいと思いますか?3b. しかし、*nix システムで run_cgi() が実行されると、スクリプトは fork されたプロセスによって実行されます。子の stdout は self.wfile に直接書き込むと思います (これについては少し漠然としています)。そのため、run_cgi() のコードが出力をチェックする機会はありません。うーん。助言がありますか?
content-type
スクリプトの出力を分析することが推奨される場合、ヘッダーがあるかどうかを認識する標準的な方法は email.parserですか? 代わりに別の標準モジュールが推奨されますか?主な質問 (「CGIHTTPRequestHandler に基づく CGI サーバーはどのように要求できるか...」) を尋ねるためのより適切なフォーラムはありますか? スタック オーバーフローよりもプログラミングに関する質問をするのに適したフォーラムがあるかどうかを尋ねるのは奇妙に思えますが、何でも可能だと思います。
助けてくれてありがとう。