記事更新:2020年3月5日
注1:のpythonをインストールするを参照してください:のpythonのインストールと基本的な文法
注2:設定ウェブ環境は参照:WindowsとLinuxのビルドWebサーバに統合された環境を使用して
注3:Linux構成CGIを参照してください:Linuxの設定のpython3のCGIの
注4:Windows設定CGIも参照:Windowsの場合CGIは、周囲のPythonで使用するように構成します
A、Webサーバのサポートおよび設定
CGIプログラミングに先立ち、CGIプログラムを処理するように設定されたサポートのCGI、ことを確認してくださいWebサーバーを作ります。ディレクトリに格納されているHTTPサーバが実行するCGIプログラムのすべてが事前に設定しました。このディレクトリはCGIと呼ばれるディレクトリで、従来の/ var / www /のCGI-binディレクトリ命名されます。慣例により、CGIは、ファイル拡張子.cgiのがありますが、ファイルの拡張子は、Python言語のスクリプトの.pyすることができます。
します。https:// //www.yiibai.com/python/python_cgi_programming.html元のチュートリアルから] [ケイシー、非商用の元のリンクを保持してください
デフォルトでは、Linuxサーバは、内の/ var / www /のCGI-binディレクトリにあるスクリプトのみを実行するように構成されています。あなたが他のディレクトリにCGIプログラムを実行したい場合は、設定ファイルを変更する必要があります。二つの方法があります。
(方法A)のScriptAliasを設け1、
では/etc/httpd/conf/httpd.conf
メインの設定ファイル、見つけるScriptAlias
の行を、それのような、必要なディレクトリを追加します。
ScriptAlias /test/ "/var/www/test/"
上記のコード/テスト/パスの実際のローカルパスに対応したウェブアクセス、は/ var / www /のテスト/あなたのWebアクセス・パスです。
設定が完了したら、保存して終了し、httpdサービスをすることができ、再起動します。
注1:上記のパス設定した後、CGIプログラムの処理として、このディレクトリ内のすべてのファイルは、HTMLファイルに入れた時間は、訪問の時間が間違っている場合。
注2:最終パス/
劣らず、より少ないエラー。
図2に示すように、構成ディレクトリに対応する(方法B)
メインの設定ファイルに次のように書き込みます:
# 下面的目录为你要设定的目录
<Directory "/var/www/test/">
Options ExecCGI
</Directory>
# 找到 AddHandler 所在行,加入你要添加的后缀,这里添加 .py
AddHandler cgi-script .cgi .py
この設定後、このディレクトリ内の.py
ファイルの終わりとしてcgi
正常に処理他のファイルを処理するプログラム。
第二に、CGI
プログラムの練習
1、プログラムおよびエンコーダを説明するための文
CGIプログラムは、プログラムステートメントプログラムインタプリタの最初に必要、インタプリタプログラムは、プログラムが実行されているものです。
Pythonの例では:
Windowsの免責事項:#! "D:\program|python37\python.exe"
、注意がに宣言する必要があります.exe
ファイル。
Linuxの免責:#! /usr/bin/env python3
も使用することができます#!/usr/bin/python3
そして、2行目は、プログラムコードを宣言します。# -*- coding:UTF-8 -*-
注、フロントのみ2行の範囲内でプログラムコードが有効と宣言しました。
図2に示すように、ヘッドの出力応答(HTTPヘッダ)情報
例えば:
print("Content-type:text/html")
次のようにいくつかの重要なHTTPヘッダは次のとおりです。
ヘッダ | 説明 |
---|---|
コンテンツタイプ: | MIME形式の文字列の定義ファイルを返します。このようなコンテンツタイプとして:text / htmlの |
有効期限:日付を | 日付情報は無効になります。これは、ページをリフレッシュする必要がある場合に決定するために使用されるブラウザでなければなりません。効果的な日付書式文字列は1998年1月1日午前12時〇〇分00秒GMTでなければなりません。 |
場所:URL | これは、交換要求URL URLのを返す必要があります。このフィールドは、任意のファイルへの要求をリダイレクトするために使用することができます。 |
最終更新:日 | リソースの最終変更日。 |
コンテンツの長さ:N | バイト単位のデータの長さが、返されます。ブラウザは、ファイルの推定ダウンロード時間を報告するには、この値を使用しています。 |
Set-Cookie:文字列 | クッキー文字列の受け渡しを提供することにより |
出力ヘッダ以降の1-2出力空白行を終了しprint("\n")
、それ以外の場合はエラーになり、エンドのサーバーヘッダ部分を伝えるために。
3、CGI環境変数。
すべてのCGIプログラムは、以下の環境変数を使用することができます。
環境変数 | 説明 |
---|---|
CONTENT_TYPE | コンテンツのデータ型。クライアントが接続されたサーバにコンテンツを送信するとき。例えば、ファイルのアップロード。 |
CONTENT_LENGTH | クエリ長情報。それだけPOSTリクエストに適用されます。 |
HTTP_COOKIE | 戻り値フォームセットクッキーのキーと値のペア。 |
HTTP_USER_AGENT | User-Agentリクエストヘッダフィールドは、ユーザエージェントが開始要求に関する情報が含まれています。Webブラウザに名前を付けます。 |
PATH_INFOTCGI | スクリプトへのパス。 |
クエリ文字列 | 情報送信要求の方法は、GET URL符号化されます。 |
REMOTE_ADDR | リモートホストのIPアドレスは、要求を送信します。これは、記録するために使用されるか、または認証の目的のために有用であることがあることができます。 |
リモートホスト | 完全修飾ホスト名は、要求を送信しました。この情報が入手できない場合は、IPアドレスREMOTE_ADDRを取得するために使用することができます。 |
REQUEST_METHOD | 要件を製造する方法。最も一般的に使用される方法は、GETとPOSTです。 |
SCRIPT_FILENAMECGI | スクリプトへのフルパス。 |
SCRIPT_NAMECGI | スクリプトの名前。 |
サーバーネーム | サーバのホスト名またはIPアドレス |
SERVER_SOFTWARE | ソフトウェア名とサーバーのバージョンが実行されています。 |
私たちは、インポートするこれらの変数を使用してos
、たとえば、パッケージを:
#! /usr/bin/env python
# -*- coding:UTF-8 -*-
print('Content-Type: text/html; charset=utf-8\n')
import os
print("你好")
print("<br>你的IP是:%s"%os.environ['REMOTE_ADDR'])
図4に示すように、GET / POSTメソッド
GETメソッドは、明示的に情報を伝えるために適用され、コンテンツがURLに表示され、1024文字の長さの制限があります。
POSTメソッドなしサイズ制限暗黙の送信は、それがより安全です。
:たとえば
GET:アクセス/cgi-bin/test.py?key=hello
、値が提供されますhello
のをkey
しcgi
-program。
POST:アクセス/cgi-bin/test.py
に渡された値cgi
のプログラム。
両方が同じスクリプトを使用して受信することができる、cgi
プログラムは、この値を受信して処理するために使用されてもよいです。
#! /usr/bin/env python3
# -*- utf-8 -*-
# 导入处理模块
import cgi, cgitb
# 创建FieldStorage实例
form = cgi.FieldStorage()
# 进行赋值操作
getvalue = form.getvalue('key')
# 输出报文头并换行结束头部
print("Content-type:text/html\n")
# 输出HTML代码
print("<html>")
print("<head>")
print("<title>Get value program!</title>")
print("</head>")
print("<body>")
print("You have put the value: %s"%getvalue)
print("</body>")
print("</html>")
5、CGIプログラムを使用して cookies
HTTPはステートレスなプロトコルですが、滞在がログインしたときのページからあなたのサイトへの訪問者は、別のページにジャンプしたい場合は、使用することができますcookies
達成するために。
クッキー、訪問者のコンピュータのハードドライブに保存されたテキストのシンプルな作品サーバ要求され、このテキストは、訪問者の身元を特定します。
ビジターは別のページに1ページからジャンプした場合、ブラウザは、訪問者の同一性を決定するために、このテキスト・サーバをチェックし、このテキストをもたらすでしょう。
cookies
図5は、可変長平文データです。
値 | 説明 |
---|---|
有効期限 | クッキーの有効期限は、左のブランクはそれは有効期限が切れているブラウザを終了することを意味している場合 |
ドメイン | あなたのサイトのドメイン名が有効になるクッキー |
道 | どのページ左のブランクそれは、すべてのテイク効果を意味している場合、パスは、サイトの効果的なドメイン名に反映することができます |
セキュア | 接続が安全を超える転送するかどうかを指定HTTPSクッキー |
名前=値 | クッキーの名前と値であるキー情報のクッキーは、あなたが複数を設定することができます |
例えば:
print "Set-Cookie:UserID=mingzi;"
print "Set-Cookie:Password=mima123;"
print "Set-Cookie:Expires=Tuesday, 3-Dec-2020 08:30:00 GMT";"
print "Set-Cookie:Domain=www.xxxx.com;"
print "Set-Cookie:Path=/test;"
print "Content-type:text/html"
それでは、どのようにCGIクッキーが行うのですか?
#!/usr/bin/python
# -*- utf-8 -*-
print("Content-type:text/html\n")
# Import modules for CGI handling
from os import environ
import cgi, cgitb
if environ.has_key('HTTP_COOKIE'):
for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
(key, value ) = split(cookie, '=');
if key == "UserID":
user_id = value
if key == "Password":
password = value
print "User ID = %s" % user_id
print "Password = %s" % password