Das beste Python CGI-Programmierung-Tutorial im Jahr 2024. In diesem Tutorial können Sie Was ist CGI,Web-Browsing,CGI-Diagramm,Web-Server-Konfiguration und Support,Das erste CGI-Programm,HTTP-Header,CGI-Umgebungsvariablen,GET und POST-Methoden,CGI wird genutzt, Plätzchen,Cookie-Einstellungen,Abrufen von Informationen zu Cookies,Dialogfeld Dateidownload, lernen
CGI derzeit verwaltet von NCSA, NCSA CGI ist wie folgt definiert:
CGI (Common Gateway Interface), Common Gateway Interface, das ein Programm auf dem Server ausgeführt wird, wie zum Beispiel: HTTP-Server, die Client-Schnittstelle die gleiche HTML-Seite bereitstellt.
Um besser zu verstehen, wie CGI funktioniert, können wir auf einen Link klicken Sie auf einer Webseite oder URL des Prozesses:
CGI-Programme können ein Python-Skript, PERL-Skript, Shell-Skript, C oder C ++ Programme sein.
Bevor Sie die CGI-Programmierung durchführen, stellen Sie sicher, dass Ihr Webserver konfiguriert wurde CGI und CGI-Handler zu unterstützen.
Apache unterstützt CGI-Konfiguration:
Stellen Sie das CGI-Verzeichnis auf:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Alle HTTP-Server CGI-Programme auszuführen, werden in einem vorkonfigurierten Verzeichnis gespeichert. Dieses Verzeichnis ist das CGI-Verzeichnis genannt, und durch Konvention, es heißt / var / www / cgi-bin-Verzeichnis.
CGI Dateierweiterung .cgi kann Python auch die Py-Erweiterung verwenden.
Standardmäßig Linux-Server-Konfiguration cgi-bin-Verzeichnis ausgeführt wird, ist / var / www.
Wenn Sie ein anderes Verzeichnis angeben möchten, CGI-Skripte ausführen, können Sie die Konfigurationsdatei httpd.conf wie folgt ändern:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
In Py Suffix AddHandler, so können wir das Ende Py Python-Skript-Datei zugreifen:
AddHandler cgi-script .cgi .pl .py
Wir Python verwenden, um die erste CGI-Programm zu erstellen hello.py genannt, wird die Datei in / var / www / cgi-bin-Verzeichnis befinden, wie folgt:
#!/usr/bin/python # -*- coding: UTF-8 -*- print "Content-type:text/html" print # 空行,告诉服务器结束头部 print '<html>' print '<head>' print '<meta charset="utf-8">' print '<title>Hello Word - 我的第一个 CGI 程序!</title>' print '</head>' print '<body>' print '<h2>Hello Word! 我是来自本教程的第一CGI程序</h2>' print '</body>' print '</html>'
Nachdem Sie die Datei Änderung hello.py speichern, ändern Sie die Dateiberechtigungen auf 755:
chmod 755 hello.py
Das obige Programm wird im Browser angezeigt, die Ergebnisse für den Zugriff sind wie folgt:
Das hello.py dieses Skript ist ein einfaches Python-Skript, das Skript von der ersten Ausgangsleitung "Content-type: text / html" an den Browser-Typ zu senden und zu dem Browser mitteilen, den Inhalt als "text / html" anzuzeigen.
Die Druckausgabe mit einer Leerzeile wird verwendet, um den Server Ende der Header-Informationen zu erzählen.
hello.py Dateiinhalt in: Teil des HTTP-Header "Content-Type text / html", wird sie an den Browser Inhaltstyp gesendet werden erzählt die Browser-Dateien.
HTTP-Header-Format ist wie folgt:
HTTP 字段名: 字段内容
Zum Beispiel:
Content-type: text/html
Die folgende Tabelle beschreibt die Informationen in den HTTP-Header CGI-Programme werden häufig verwendet:
Kopf | Beschreibung |
---|---|
Content-type: | MIME-Einheit an die Informationsanforderung entspricht. Zum Beispiel: Content-type: text / html |
Gültig bis: Datum | Antwort Datum und Zeit abgelaufen |
Standort: URL | Um den Empfänger in einen nicht-location URL Anfrage umleiten die Anfrage oder die Identifizierung neuer Ressourcen zu vervollständigen |
Last-Modified: Datum | Die angeforderte Ressource wurde zuletzt geändert |
Content-length: N | Content-Length-Anfrage |
Set-Cookie: String | Http Cookie-Einstellungen |
Alle CGI-Programme haben die folgenden Umgebungsvariablen erhalten, die eine wichtige Rolle in der CGI-Programm gespielt:
Variablenname | Beschreibung |
---|---|
CONTENT_TYPE | Dieser Wert zeigt an, dass die Umgebungsvariable auf den MIME-Typ der Informationsübertragung. Derzeit sind die Umgebungsvariablen im Allgemeinen CONTENT_TYPE: application / x-www-form-urlencoded, sagte er, dass die Daten aus dem HTML-Formular. |
CONTENT_LENGTH | Wenn der Übertragungsmodus-Server und CGI-Programminformationen POST, selbst wenn die Umgebungsvariable STDIN Eingabe der Anzahl von Bytes, die gültige Daten aus dem Standard gelesen werden kann. Diese Umgebungsvariable, wenn die Eingabedaten Lesen verwendet werden. |
HTTP_COOKIE | COOKIE Inhalt innerhalb des Client. |
HTTP_USER_AGENT | Die Bereitstellung von Informationen enthält die Versionsnummer der Client-Browser oder andere urheberrechtlich geschützte Daten. |
PATH_INFO | Der Wert dieser Umgebungsvariable gibt den Namen des CGI-Programms unmittelbar nach dem zusätzlichen Pfadinformationen. Oft scheint es, als Argument CGI-Programm. |
QUERY_STRING | Wenn der Übertragungsmodus-Server und CGI-Programminformationen Informationen zu erhalten, um den Wert dieser Umgebungsvariablen selbst wenn weitergegeben. Diese Information wird durch den Namen des CGI-Programms, die beide in der Mitte mit einem Fragezeichen "?" Separator gefolgt. |
REMOTE_ADDR | Der Wert dieser Umgebungsvariablen ist die IP-Adresse des Client eine Anfrage sendet, beispielsweise die oben 192.168.1.67. Dieser Wert ist immer vorhanden. Und es ist die Notwendigkeit der Web-Client auf dem Webserver die eindeutige Kennung zu schaffen, in CGI-Programmen verwendet werden, um zwischen verschiedenen Web-Client zu unterscheiden. |
REMOTE_HOST | Der Wert dieser Umgebungsvariable enthält den Host-Namen des anfordernden Clients von CGI. Wenn es Sie nicht überprüfen möchten, brauchen Sie nicht diese Umgebungsvariable zu definieren. |
REQUEST_METHOD | Es stellt eine Methode namens Skript. Für HTTP / 1.0-Protokoll-Skript nur GET und POST sinnvoll. |
SCRIPT_FILENAME | Der vollständige Pfad zum CGI-Skripten |
SCRIPT_NAME | Der Name des CGI-Skript |
SERVER_NAME | Dies ist der Hostname, Alias oder IP-Adresse Ihres Web-Server. |
SERVER_SOFTWARE | Der Wert dieser Umgebungsvariable enthält den Aufruf CGI Programmnamen und die Versionsnummer des HTTP-Servers. Zum Beispiel kann der obige Wert von Apache / 2.2.14 (Unix) |
Hier ist ein einfaches CGI-Skript-Ausgabe CGI-Umgebungsvariablen:
#!/usr/bin/python # -*- coding: UTF-8 -*- # filename:test.py import os print "Content-type: text/html" print print "<meta charset=\"utf-8\">" print "<b>环境变量</b><br>"; print "<ul>" for key in os.environ.keys(): print "<li><span style='color:green'>%30s </span> : %s </li>" % (key,os.environ[key]) print "</ul>"
Speichern Sie die oben genannten Punkte test.py, und ändern Sie die Dateiberechtigungen auf 755, die Ausführungsergebnisse sind wie folgt:
Browser-Client zum Server-Informationen auf zwei Arten zu liefern, von denen beide Verfahren Methoden GET und POST ist.
GET Methode, um die codierten Benutzerinformationen an den Server zu senden, unterteilt die Dateninformationen in der URL der Seite Anfrage Nummer enthalten ist, wie folgt "?":
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2GET-Anfragen über einige der anderen Kommentare:
Im Folgenden ist eine einfache URL, GET-Methode unter Verwendung von zwei Parametern zu senden Programm hello_get.py:
/cgi-bin/test.py?name=本教程&url=http://www.w3write.com
Ein Code hello_get.py Datei:
#!/usr/bin/python # -*- coding: UTF-8 -*- # filename:test.py # CGI处理模块 import cgi, cgitb # 创建 FieldStorage 的实例化 form = cgi.FieldStorage() # 获取数据 site_name = form.getvalue('name') site_url = form.getvalue('url') print "Content-type:text/html" print print "<html>" print "<head>" print "<meta charset=\"utf-8\">" print "<title>本教程 CGI 测试实例</title>" print "</head>" print "<body>" print "<h2>%s官网:%s</h2>" % (site_name, site_url) print "</body>" print "</html>"
Nachdem Sie die Datei Änderung hello_get.py speichern, ändern Sie die Dateiberechtigungen auf 755:
chmod 755 hello_get.py
Browser-Anforderungen Ausgabe:
Es folgt eine zwei Daten senden an den Server der GET-Methode über ein HTML-Formular verwenden, eingereicht denselben Server-Skript hello_get.py Datei ist hello_get Code wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/hello_get.py" method="get"> 站点名称: <input type="text" name="name"> <br /> 站点 URL: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
Standardmäßig kann das Verzeichnis cgi-bin nur eine Skriptdatei speichern, werden wir unter dem Testverzeichnis sein, ändern Sie die Dateiberechtigungen als 755 gespeichert hello_get:
chmod 755 hello_get
Gif-Präsentation ist wie folgt:
Mit Hilfe der POST-Methode übergeben Daten an den Server sicherer und zuverlässiger, da einige sensible Daten wie Benutzerkennwörter POST verwenden müssen, ist es, Daten zu übertragen.
Hier finden Sie auch hello_get.py, kann es auch durch den Browser übermittelt POST Formulardaten verarbeiten:
#!/usr/bin/python # -*- coding: UTF-8 -*- # CGI处理模块 import cgi, cgitb # 创建 FieldStorage 的实例化 form = cgi.FieldStorage() # 获取数据 site_name = form.getvalue('name') site_url = form.getvalue('url') print "Content-type:text/html" print print "<html>" print "<head>" print "<meta charset=\"utf-8\">" print "<title>本教程 CGI 测试实例</title>" print "</head>" print "<body>" print "<h2>%s官网:%s</h2>" % (site_name, site_url) print "</body>" print "</html>"
Nachfolgend finden Sie eine Formulardaten an den Server - Skript hello_get.py durch POST - Methode (method = "post") einreichen:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/hello_get.py" method="post"> 站点名称: <input type="text" name="name"> <br /> 站点 URL: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
Gif-Präsentation ist wie folgt:
Checkbox, die eine oder mehrere Optionsdaten vorzulegen, ist HTML-Code wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/checkbox.py" method="POST" target="_blank"> <input type="checkbox" name="w3big" value="on" /> 本教程 <input type="checkbox" name="google" value="on" /> Google <input type="submit" value="选择站点" /> </form> </body> </html>
Ein Code checkbox.py Datei:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('google'): google_flag = "是" else: google_flag = "否" if form.getvalue('w3big'): w3big_flag = "是" else: w3big_flag = "否" print "Content-type:text/html" print print "<html>" print "<head>" print "<meta charset=\"utf-8\">" print "<title>本教程 CGI 测试实例</title>" print "</head>" print "<body>" print "<h2> 本教程是否选择了 : %s</h2>" % w3big_flag print "<h2> Google 是否选择了 : %s</h2>" % google_flag print "</body>" print "</html>"
Ändern checkbox.py Berechtigungen:
chmod 755 checkbox.py
Browser-Zugriff Gif Präsentations-Charts:
Nur Radio übertragen Daten an einen Server, HTML-Code ist wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/radiobutton.py" method="post" target="_blank"> <input type="radio" name="site" value="w3big" /> 本教程 <input type="radio" name="site" value="google" /> Google <input type="submit" value="提交" /> </form> </body> </html>
radiobutton.py Script-Code ist wie folgt:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('site'): site = form.getvalue('site') else: site = "提交数据为空" print "Content-type:text/html" print print "<html>" print "<head>" print "<meta charset=\"utf-8\">" print "<title>本教程 CGI 测试实例</title>" print "</head>" print "<body>" print "<h2> 选中的网站是 %s</h2>" % site print "</body>" print "</html>"
Ändern radiobutton.py Berechtigungen:
chmod 755 radiobutton.py
Browser-Zugriff Gif Präsentations-Charts:
TextArea- Pass mehrere Reihen von Daten an den Server ist HTML Code wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/textarea.py" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容de. </textarea> <input type="submit" value="提交" /> </form> </body> </html>
textarea.py Script-Code ist wie folgt:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('textcontent'): text_content = form.getvalue('textcontent') else: text_content = "没有内容" print "Content-type:text/html" print print "<html>" print "<head>"; print "<meta charset=\"utf-8\">" print "<title>本教程 CGI 测试实例</title>" print "</head>" print "<body>" print "<h2> 输入的内容是:%s</h2>" % text_content print "</body>" print "</html>"
Ändern textarea.py Berechtigungen:
chmod 755 textarea.py
Browser-Zugriff Gif Präsentations-Charts:
HTML Dropdown-Feld Code wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/dropdown.py" method="post" target="_blank"> <select name="dropdown"> <option value="w3big" selected>本教程</option> <option value="google">Google</option> </select> <input type="submit" value="提交"/> </form> </body> </html>
dropdown.py Script-Code wie folgt:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 引入 CGI 处理模块 import cgi, cgitb # 创建 FieldStorage的实例 form = cgi.FieldStorage() # 接收字段数据 if form.getvalue('dropdown'): dropdown_value = form.getvalue('dropdown') else: dropdown_value = "没有内容" print "Content-type:text/html" print print "<html>" print "<head>" print "<meta charset=\"utf-8\">" print "<title>本教程 CGI 测试实例</title>" print "</head>" print "<body>" print "<h2> 选中的选项是:%s</h2>" % dropdown_value print "</body>" print "</html>"
Ändern dropdown.py Berechtigungen:
chmod 755 dropdown.py
Browser-Zugriff Gif Präsentations-Charts:
Http-Protokoll in einem großen Nachteil ist falsch die Identität eines Benutzers zu beurteilen, die Programmierer viel Unannehmlichkeiten geben, scheint aber die Cookie-Funktion für diesen Mangel besteht.
Cookie, das das Skript, während der Kunde durch den Browser des Kunden auf dem Client-Festplatte zugreift, um Datensätze zu schreiben, Daten abrufen, wenn ein Kunde das nächste Skript besucht, um die Funktion der Bestimmung der Identität zu erreichen, Cookie bei der Überprüfung der Identität verwendet.
Http-Cookie wird durch den HTTP-Header gesendet zu erreichen, hatte er die Übertragung von Dateien, Header-Set-Cookie-Syntax lautet wie folgt:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
Cookie-Einstellungen ist sehr einfach, Cookie wird separat unter http-Header gesendet. Im folgenden Beispiel wird der Name und endet in einem Cookie:
#!/usr/bin/python # -*- coding: UTF-8 -*- # print 'Content-Type: text/html' print 'Set-Cookie: name="本教程";expires=Wed, 28 Aug 2016 18:30:00 GMT' print print """ <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <h1>Cookie set OK!</h1> </body> </html> """
Speichern Sie den Code oben zu cookie_set.py und ändern cookie_set.py Berechtigungen:
chmod 755 cookie_set.py
Die obigen Beispiele zeigen die Set-Cookie-Header verwenden, um die Cookie-Informationen zum Festlegen von Optionen zu Cookies andere Attribute, wie das Ablaufzeit abgelaufen ist, Domain-Domain, Pfad Pfad. Diese Informationen werden zur Verfügung gestellt: Vor dem "Content-Type text / html".
Cookie-Information-Retrieval-Seite ist sehr einfach, in der CGI-Umgebungsvariablen HTTP_COOKIE, das Speicherformat ist wie folgt Cookie-Informationen gespeichert sind:
key1=value1;key2=value2;key3=value3dede
Hier ist ein einfaches CGI-Programm zu Cookie-Informationen abrufen:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 导入模块 import os import Cookie print "Content-type: text/html" print print """ <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <h1>读取cookie信息</h1> """ if 'HTTP_COOKIE' in os.environ: cookie_string=os.environ.get('HTTP_COOKIE') c=Cookie.SimpleCookie() c.load(cookie_string) try: data=c['name'].value print "cookie data: "+data+"<br>" except KeyError: print "cookie 没有设置或者已过去<br>" print """ </body> </html> """
Speichern Sie den Code oben zu cookie_get.py und ändern cookie_get.py Berechtigungen:
chmod 755 cookie_get.py
Mehr Farbe Gif Cookie-Einstellungen sind wie folgt:
HTML - Einstellungsdatei multipart / form-data, Code zu laden müssen das enctype Attribut wie folgt festzulegen:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form enctype="multipart/form-data" action="/cgi-bin/save_file.py" method="post"> <p>选中文件: <input type="file" name="filename" /></p> <p><input type="submit" value="上传" /></p> </form> </body> </html>
save_file.py Skriptdatei Code ist wie folgt:
#!/usr/bin/python # -*- coding: UTF-8 -*- import cgi, os import cgitb; cgitb.enable() form = cgi.FieldStorage() # 获取文件名 fileitem = form['filename'] # 检测文件是否上传 if fileitem.filename: # 设置文件路径 fn = os.path.basename(fileitem.filename) open('/tmp/' + fn, 'wb').write(fileitem.file.read()) message = '文件 "' + fn + '" 上传成功' else: message = '文件没有上传' print """\ Content-Type: text/html\n <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <p>%s</p> </body> </html> """ % (message,)
Speichern Sie den Code oben zu save_file.py und ändern save_file.py Berechtigungen:
chmod 755 save_file.py
Mehr Farbe Gif Cookie-Einstellungen sind wie folgt:
Wenn Sie Unix / Linux verwenden, müssen Sie die Datei Separator im Fenster ersetzen nur open () Anweisung sein kann verwenden müssen:
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
Wir schaffen foo.txt Datei im aktuellen Verzeichnis, das Programm zum Download bereit.
Laden Sie die Datei, indem Sie den HTTP-Header-Informationen Einstellung der Funktionscode zu implementieren, ist wie folgt:
#!/usr/bin/python # -*- coding: UTF-8 -*- # HTTP 头部 print "Content-Disposition: attachment; filename=\"foo.txt\""; print # 打开文件 fo = open("foo.txt", "rb") str = fo.read(); print str # 关闭文件 fo.close()