CGI とは
CGI は現在 NCSA によって管理されています。NCSA は CGI を次のように定義しています:
CGI (Common Gateway Interface)、共通ゲートウェイ インターフェイス。HTTP サーバーなどのサーバー上で実行されるプログラムであり、同じものを提供します。クライアントの HTML ページ インターフェイス。
Web ブラウズ
CGI の仕組みをよりよく理解するには、Web ページ上のリンクまたは URL をクリックするプロセスから始めます。
1. ブラウザを使用して URL にアクセスし、HTTP Web サーバーに接続します。
2. リクエスト情報を受信した後、Web サーバーは URL を解析し、アクセスされたファイルがサーバー上に存在するかどうかを確認し、ファイルが存在する場合はファイルの内容を返します。存在しない場合はエラー メッセージが返されます。
3. ブラウザはサーバーから情報を受信し、受信したファイルやエラーメッセージを表示します。
CGI プログラムには、Python スクリプト、PERL スクリプト、SHELL スクリプト、C または C++ プログラムなどがあります。
CGI アーキテクチャ図
Web サーバーのサポートと構成
CGI プログラミングを実行する前に、Web サーバーが CGI をサポートし、CGI ハンドラーが構成されていることを確認してください。
すべての HTTP サーバー実行 CGI プログラムは、事前設定されたディレクトリに保存されます。このディレクトリは CGI ディレクトリと呼ばれ、慣例により /var/www/cgi-bin という名前が付けられます。
CGI ファイルの拡張子は .cgi ですが、Python では .py 拡張子も使用できます。
デフォルトでは、Linux サーバーが実行するように設定されている cgi-bin ディレクトリは /var/www です。
CGI スクリプトを実行するために他のディレクトリを指定したい場合は、httpd.conf 設定ファイルを次のように変更できます:
AllowOverrideなし
オプション ExecCGI
順序 許可、拒否
すべてから許可
ディレクトリ>
オプション すべて
最初の CGI プログラムを作成するには、Python を使用します。ファイル名は、/var/www/cgi-bin ディレクトリにあります。ファイルの内容は次のとおりです。権限は 755 です:
#!/usr/bin/python print "Content-type: text/htmlrnrn"print '' print ''print 'Hello Word! これは私の最初の CGI プログラムです
この hello.py スクリプトは単純な Python スクリプトですスクリプトの最初の出力コンテンツ「Content-type: text/htmlrnrn」がブラウザに送信され、表示されるコンテンツ タイプが「text/html」であることがブラウザに伝えられます。
HTTP ヘッダー
hello.py ファイルのコンテンツ "Content-type: text/htmlrnrn" は HTTP ヘッダーの一部であり、ファイルのコンテンツ タイプをブラウザーに伝えるためにブラウザーに送信されます。
HTTPヘッダーの形式は次のとおりです:
HTTPフィールド名:フィールドコンテンツ
例:
Content-type:text/htmlrnrn
次の表はHTTPを紹介しています。 CGI プログラムの head 一般的に使用される情報:
Header
Description
Content-type: エンティティに対応する要求された MIME 情報。例: Content-type:text/html
Expires: Date 応答の有効期限が切れる日時
Location: URL 要求を完了するか、新しい URL を識別するために、受信者を要求されていない URL の場所にリダイレクトするために使用されます。 resource
Last-modified : Date 要求されたリソースの最終変更時刻
Content-length: N 要求されたコンテンツの長さ
Set-Cookie: String Set Http Cookie
CGI 環境変数
すべての CGI プログラムは次の環境変数を受け取ります、これらの変数は CGI プログラムで重要な役割を果たします:
変数名
説明
CONTENT_TYPE この環境変数の値は、渡される情報の MIME タイプを示します。現在、環境変数 CONTENT_TYPE は通常、application/x-www-form-urlencoded であり、データが HTML フォームから取得されることを示します。
CONTENT_LENGTH サーバーと CGI プログラム間の情報伝達方式が POST の場合、この環境変数は標準入力 STDIN から読み込める有効なデータのバイト数です。この環境変数は、入力されたデータを読み取るときに使用する必要があります。
HTTP_COOKIE クライアント内の COOKIE コンテンツ。
HTTP_USER_AGENT バージョン番号やその他の独自データを含むクライアント ブラウザ情報を提供します。
PATH_INFO この環境変数の値は、CGI プログラム名の直後の他のパス情報を表します。多くの場合、CGI プログラムのパラメータとして表示されます。
QUERY_STRING サーバーとCGIプログラム間の情報転送方式がGETの場合、この環境変数の値が転送される情報となります。この情報は、CGI プログラム名の後に疑問符「?」で区切って続きます。
REMOTE_ADDR この環境変数の値は、リクエストを送信するクライアントの IP アドレス (上記の 192.168.1.67 など) です。この値は常に存在します。これは、Web クライアントが Web サーバーに提供する必要がある一意の識別子であり、CGI プログラムでさまざまな Web クライアントを区別するために使用できます。
REMOTE_HOST この環境変数の値には、CGI リクエストを送信したクライアントのホスト名が含まれます。クエリしたいクエリがサポートされていない場合、この環境変数を定義する必要はありません。
REQUEST_METHOD スクリプトを呼び出すメソッドを提供します。 HTTP/1.0 プロトコルを使用するスクリプトの場合、GET と POST のみが意味を持ちます。
SCRIPT_FILENAME CGI スクリプトのフルパス
SCRIPT_NAME CGI スクリプトの名前
SERVER_NAME WEB サーバーのホスト名、エイリアス、または IP アドレスです。
SERVER_SOFTWARE この環境変数の値には、CGI プログラムを呼び出す HTTP サーバーの名前とバージョン番号が含まれます。たとえば、上記の値は Apache/2.2.14 (Unix) です。
以下は、CGI 環境変数を出力する簡単な CGI スクリプトです:
#!/usr/bin/python
import os
print "Content-type: text/htmlrnrn";
print "環境
";
for param in os.environ.keys() :
print "%20s: %s
" % (param, os.environ[param])
GET メソッドと POST メソッド
ブラウザ クライアントは 2 つのメソッドを渡しますサーバーに情報を送信するには、GET メソッドと POST メソッドの 2 つの方法があります。
データを送信するには GET メソッドを使用します
GET メソッドは、以下に示すように、エンコードされたユーザー情報をリクエスト ページの URL に「?」で区切って含めて送信します。
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
GET リクエストに関するその他の注意事項:
GET リクエストはキャッシュ可能
GET リクエストはそのまま残りますブラウザで
GETリクエストは履歴にブックマークできます
GETリクエストは機密データを扱う場合には使用しないでください
GETリクエストには長さ制限があります
GETリクエストはデータを取得するためにのみ使用してください
簡単なURLの例: GET メソッド
以下は、GET メソッドを使用して hello_get.py プログラムに 2 つのパラメーターを送信する単純な URL です:
/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI
hello_get.py ファイルの次のコード:
#!/usr/bin/python
# CGI 処理モジュール
import cgi, cgitb
# FieldS のインスタンスを作成するとらじ
form = cgi.FieldStorage()
# データを取得
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print "Content-type: text /htmlrnrn"
print ""
print "
"print "
print ""
print "
"print "
print ""
print "> ;"
ブラウザリクエストの出力結果:
Hello ZARA ALI
簡単なフォーム例: GETメソッド
以下は、GET メソッドを使用して 2 つのデータをサーバーに送信する HTML フォームです。送信されたサーバー スクリプトも hello_get.py ファイルです。コードは次のとおりです。
POST メソッドを使用して、データを渡す
POST メソッドを使用する サーバーへのデータの送信は、ユーザーのパスワードなどの一部の機密情報は POST を使用して送信する必要があります。
以下も hello_get.py で、ブラウザによって送信された POST フォーム データも処理できます:
#!/usr/bin/python
# CGI モジュールの紹介
import cgi、 cgitb
# FieldStorage インスタンスの作成
form = cgi.FieldStorage()
# フォームデータの取得
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print "Content-type:text/htmlrnrn"
print ""
print "
"print "
print ""
print "
"print "
print " body> "
print ""
次のフォームは、POST メソッドを通じてサーバー スクリプト hello_get.py にデータを送信します:
CGI プログラムを介してチェックボックス データを転送チェックボックスが使用されます 1 つ以上のオプション データを送信するには、HTML コードは次のとおりです: 以下は、checkbox.cgi ファイルのコードです:#!/usr/bin/python
# CGI処理モジュールの導入 import cgi, cgitb # FieldStorageのインスタンスを作成 form = cgi.FieldStorage()
#受信フィールドデータ
if form.getvalue('maths' ): math_flag = "ON"else: math_flag = "OFF" if form.getvalue('physics'): Physical_flag = " ON"else: physics_flag = " OFF" print "Content-type:text/htmlrnrn"print ""print ""print "< ;title>Checkbox - 3 番目の CGI プログラム> ;"print ""print ""print "
textarea.cgi代筆如下:
#!/usr/bin/python
# CGI処理用のインポートモジュール
import cgi, cgitb
# Cre FieldStorage のインスタンスを食べました
フォーム = cgi.FieldStorage()
# フィールドからデータを取得する
if form.getvalue('textcontent'):
text_content = form.getvalue('textcontent')
else:
text_content = 「未入力」
print "Content-type:text/htmlrnrn"
print ""
print "
";print "
print ""
print "
"print "
print ""
通过CGI程序传递下拉数据
HTML下拉框代码如下:
ドロップダウン.py脚本代码如下示:
#!/usr/bin/python
# CGI 処理用のインポートモジュール
import cgi, cgitb
# FieldStorage のインスタンスを作成します
フォーム= cgi.FieldStorage()
# フィールドからデータを取得する
if form.getvalue('dropdown'):
subject = form.getvalue('dropdown')
else:
subject = 「未入力」 "
print "Content-type:text/htmlrnrn"
print ""
print "
"print "
print ""
print " & lt; body & gt; "
" & lt; h2 & gt; select subject is%s & lt; ""
CGI の大きな欠点http プロトコルはユーザーの身元を判断しないという点で、プログラマにとっては非常に不便です Cookie 機能の登場により、この欠点が補われます。 すべての Cookie は、顧客がスクリプトにアクセスしたときに、顧客のブラウザを通じて顧客のハードドライブに記録データを書き込み、そのデータ情報は次回顧客がスクリプトにアクセスしたときに取得され、それによって身元識別機能を実現します。パスワードの判定にはCookieがよく使われます。 Cookieの構文http cookieは、ファイル転送よりも先にhttpヘッダーを介して送信されます。ヘッダー内のset-cookieの構文は次のとおりです: Set-cookie:name=。 name;expires=date;path=path;domain=domain;secure name=name: 複数の名前がある場合、Cookie の値を設定する必要があります (名前に「;」と「,」は使用できません)。値 「;」で区切ります。例: name1=name1;name2=name2;name3=name3。 expires=date: Cookie の有効期間、形式:expires="Wdy,DD-Mon-YYYY HH:MM:SS" path=path: path がパスの場合、Cookie によってサポートされるパスを設定しますの場合、Cookie はこのディレクトリ内のすべてのファイルとサブディレクトリに対して有効になります (例: path="/cgi-bin/")。 path がファイルの場合、Cookie はこのファイルに対して有効になります (例: path="/cgi-)。 bin/cookie「.cgi」。 domain=domain: Cookie に有効なドメイン名 (例:domain="www.chinalb.com") secure: このフラグが指定されている場合、Cookie は https 経由でのみ配信できることを意味しますSSLプロトコルのサーバー。 Cookie の受信は環境変数 HTTP_COOKIE を設定することで実現され、CGI プログラムはこの変数を取得することで Cookie 情報を取得できます。 Cookieの設定Cookieの設定は非常に簡単で、Cookieはhttpヘッダーで個別に送信されます。次の例では、Cookie にユーザー ID とパスワードを設定します:<p></p>#!/usr/bin/python<p></p> <p></p>print "Set-Cookie:UserID=XYZ;rn"<p></p>print " Set-Cookie:Password=XYZ123;rn"<p></p>print "Set-Cookie:Expires=火曜日、2007 年 12 月 31 日 23:12:40 GMT";rn"<p></p>print "Set-Cookie:Domain=www.ziqiangxuetang .com;rn"<p></p>print "Set-Cookie:Path=/perl;n"<p></p>print "Content-type:text/htmlrnrn"<p></p>....残りの HTML コンテンツ....<p></p> <p> </p><p></p>上記の例では、Set-Cookie ヘッダー情報を使用して Cookie 情報を設定します。有効期限 Expires、ドメイン名、パスなどの Cookie の他の属性は、「Content-type: text/」に設定されます。 htmlrnrn". <p></p>Cookie情報の取得<p></p>Cookie情報の取得ページは非常にシンプルです。Cookie情報はCGI環境変数HTTP_COOKIEに格納されており、格納形式は以下の通りです: <p></p><p></p><p></p>key1=value1; key2=value2 ;key3=value3....<p></p> <p></p><p></p> 以下は、Cookie 情報を取得する簡単な CGI プログラムです: <p></p><p></p><p></p>#!/usr/bin/python<p></p> <p></p>#CGI 処理用のモジュールのインポート<p></p>OSからenvironをインポート<p></p>import cgi、cgitb<p></p> <p></p>if environ.has_key('HTTP_COOKIE'):<p></p> for cookie in map(strip, Split(environ['HTTP_COOKIE'], ';' )): <p></p> (key, value) = split(cookie, '=');<p></p> if key == "UserID":<p></p> user_id = value<p></p><p></p> if key == "Password" :<p></p> パスワード = value<p> </p><p></p>print "User ID = %s" % user_id<p></p>print "Password = %s" %password<p></p> <p></p><p></p>上記のスクリプトの出力は次のとおりです: <p></p><p></p><p></p>U ser ID = XYZ<p> DPassword = xyz123</p><p> ファイルのアップロードの例: </p><p>Html アップロード ファイルの形式を設定して、enableype プロパティを Multipart/Form-Data として設定します。コードは次のとおりです。 </p><p></p><p></p><p> & lt; gt; </p><p> </p><p>&lt; form enctype = "multipart/form-data" </p><p> </p><p></p><p></p> <p></p><p></p>save_file.py スクリプト ファイルのコードは次のとおりです <p></p><p></p><p></p>#!/usr/bin / python<p></p> <p></p>import cgi, os<p></p>import cgit b; cgitb.enable ()<p></p><p></p>form = cgi.FieldStorage()<p></p>fileitem = form['filename'] <p></p><p></p># ファイルがアップロードされているかどうかを確認します<p></p>if fileitem.filename:<p> </p> # ファイルパスを設定します<p></p> fn = os.path.basename(fileitem.filename) <p></p> open('/tmp/' + fn, 'wb').write(fileitem.file.read())<p></p> <p></p> message = 'ファイル "' + fn + '" は正常にアップロードされました'<p></p> <p></p>else:<p></p> message = 'ファイルはアップロードされませんでした'<p></p>print """<p></p>Content-Type: text/htmln <p></p><p></p><p></p> <p>%s</p><p></p><p></p><p></p>""" % (message,)<p></p> <p> </p><p> </p>使用しているシステムが Unix/Linux の場合は、ファイル区切り文字を置き換える必要があります。ウィンドウの下では、open() を使用するだけで済みます。ステートメント: <p></p><p></p><p></p>fn = os.path.basename(fileitem.filename.replace ("\", "/" ))<p></p> <p></p><p></p>ファイルダウンロードダイアログボックス<p></p>ユーザーに提供する必要がある場合ファイルのダウンロード リンクと、ユーザーがリンクをクリックした後にファイルのダウンロード ダイアログ ボックスをポップアップ表示するため、HTTP ヘッダー情報を設定します。これらの関数を実装するための関数コードは次のとおりです: <p></p><p></p><p></p>#!/usr/bin/ python<p></p><p></p># HTTPヘッダー<p></p>print "Content-Type: application/octet-stream; name="FileName"rn ";<p></p>print "Content-Disposition:attachment; filename="FileName"rnn";<p></p> <p></p># 実際のファイルの内容を聞きます。<p></p>fo = open("foo.txt", "rb")<p></p> <p></p>str = fo.read();<p></p>print str<p></p><p></p>#開いているファイルを閉じる<p></p>fo.close()<p></p> <p></p><p></p><p></p>