ホームページ  >  記事  >  バックエンド開発  >  Python CGIプログラミング

Python CGIプログラミング

高洛峰
高洛峰オリジナル
2016-11-23 14:05:531232ブラウズ

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 アーキテクチャ図

Python 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プログラム'

print ''

print ''

print '

Hello Word! これは私の最初の CGI プログラムです

'

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 "

Hello - 2 番目の CGI プログラム"

print ""

print "

"

print "

Hello %s %s

" % (first_name, last_name)

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 "

Hello - 2 番目の CGI プログラム"

print ""

print "

"

print "

こんにちは %s %s

" % (first_name, last_name)

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 "

CheckBox Maths は : %s

" % math_flag

print "

チェックボックスの物理演算は : %s

" %physics_flag

print ""

print ""

CGI プログラムを通じてラジオ データを転送します

ラジオのみにサーバーがデータを渡します。HTML コードは次のとおりです:

 数学

 Physics

&lt; input Type = "submit" value = "select subject"/&gt;

&lt;/form&gt;

radiobutton.py /bin/python

# CGI 処理用のインポートモジュール

import cgi, cgitb

# FieldStorage のインスタンスを作成する

form = cgi.FieldStorage()

# フィールドからデータを取得する

if form.getvalue('subject'):

subject = form.getvalue('subject')

else:

subject = "Not set"

print "Content-type:text/htmlrnrn"

print ""

print "

"

print "

ラジオ - 第 4 CGI プログラム"

print ""

print "

print "

選択された件名は %s

です" % subject

print ">"

print ""

通过CGI程序传递 Textareaデータ架

Textarea向服务器传递多行データベース,HTML代如下:

ここにテキストを入力してください...

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 "

テキストエリア - 5番目のCGIプログラム> ;"

print ""

print "

"

print "

入力されたテキスト コンテンツは %s

" % text_content

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 "

ドロップダウン ボックス - 6 番目の CGI プログラム"

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>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。