Il miglior tutorial Python programmazione CGI Nel 2024, in questo tutorial puoi imparare Qual è CGI,navigazione Web,Grafico CGI,configurazione del server Web e il supporto,Il primo programma CGI,HTTP,Variabili CGI ambiente,GET e POST metodi,CGI è usata Cookie,impostazioni dei cookie,Recupero di informazioni sui cookie,finestra di dialogo Download del file,
CGI attualmente mantenuto da NCSA, NCSA CGI è definito come segue:
CGI (Common Gateway Interface), Common Gateway Interface, che è un programma in esecuzione sul server, come ad esempio: server HTTP, l'interfaccia client fornendo la stessa pagina HTML.
Per capire meglio come funziona la CGI, siamo in grado di cliccare su un link in una pagina web o un URL del processo:
programmi CGI possono essere uno script Python, script in Perl, shell script, programmi C o C ++.
Prima di effettuare la programmazione CGI, fare in modo che il server Web è stato configurato per supportare CGI e gestore CGI.
Apache supporta la configurazione CGI:
Impostare la directory CGI:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Tutti i server HTTP per eseguire programmi CGI vengono memorizzati in una directory pre-configurato. Questa directory è chiamata la directory CGI, e per convenzione, prende il nome / var / www / directory cgi-bin.
file di CGI estensione .cgi, pitone può anche usare l'estensione .py.
Per impostazione predefinita, la configurazione del server Linux in esecuzione directory cgi-bin è / var / www.
Se si desidera specificare una directory diversa per eseguire script CGI, è possibile modificare il file di configurazione httpd.conf come segue:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
Aggiungi .py AddHandler suffisso, in modo che possiamo accedere al file script python fine .py:
AddHandler cgi-script .cgi .pl .py
Usiamo Python per creare il primo programma CGI chiamato hello.py, il file si trova nella directory / var / www / cgi-bin, come segue:
#!/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>'
Dopo aver salvato il hello.py modifica del file, modificare i permessi dei file a 755:
chmod 755 hello.py
Il suddetto programma è visualizzata nel browser per accedere ai risultati sono i seguenti:
Il hello.py questo script è un semplice script Python, lo script della prima linea di uscita "Content-Type: text / html" da inviare al tipo di browser e dire al browser per visualizzare il contenuto come "text / html".
output di stampa con una riga vuota viene utilizzato per indicare la fine di server delle informazioni di intestazione.
il contenuto dei file hello.py in: parte dell'intestazione HTTP è "Content-Type text / html", verrà inviato al tipo di contenuto del browser racconta le file del browser.
formato di intestazione HTTP è il seguente:
HTTP 字段名: 字段内容
Ad esempio:
Content-type: text/html
La seguente tabella descrive le informazioni contenute nei programmi CGI di intestazione HTTP sono spesso utilizzati:
testa | descrizione |
---|---|
Content-type: | MIME entità corrispondente alla richiesta di informazioni. Per esempio: Content-Type: text / html |
Scadenza: Data | la data e l'ora di risposta scaduti |
Location: URL | Per reindirizzare il destinatario di una richiesta di non luogo URL per completare la richiesta o l'identificazione di nuove risorse |
Last-Modified: Data | risorsa richiesta è stato modificato l'ultima volta |
Content-Length: N | richiesta Content-Length |
Set-Cookie: String | Impostazioni cookie HTTP |
Tutti i programmi CGI hanno ricevuto le seguenti variabili d'ambiente, che ha svolto un ruolo importante nel programma CGI:
nome della variabile | descrizione |
---|---|
CONTENT_TYPE | Questo valore indica che la variabile d'ambiente per il tipo MIME di trasferimento di informazioni. Allo stato attuale, le variabili di ambiente sono generalmente CONTENT_TYPE: application / x-www-form-urlencoded, ha detto che i dati del modulo HTML. |
CONTENT_LENGTH | Se le informazioni di server modalità di trasferimento e programma CGI è POST, anche se l'ambiente lo STDIN variabile il numero di byte che possono essere letti dati validi dallo standard. Questa variabile di ambiente quando si leggono i dati di input deve essere utilizzato. |
HTTP_COOKIE | contenuti COOKIE all'interno del client. |
HTTP_USER_AGENT | Fornire informazioni includono il numero di versione del browser client o di altri dati proprietari. |
PATH_INFO | Il valore di questa variabile di ambiente indica il nome del programma CGI subito dopo le informazioni percorso aggiuntivo. Esso appare spesso come un programma di discussione CGI. |
QUERY_STRING | Se le informazioni del server modalità di trasferimento e programma CGI sono informazioni GET, il valore di questa variabile di ambiente, anche se passato. Questa informazione è seguito dal nome del programma CGI, sia al centro con un punto interrogativo '?' Separator. |
REMOTE_ADDR | Il valore di questa variabile ambiente è l'indirizzo IP del client invia una richiesta, ad esempio, quanto sopra 192.168.1.67. Questo valore è sempre presente. Ed è proprio la necessità di fornire al client Web di identificatore univoco del server Web può essere utilizzato in programmi CGI di distinguere tra diversi client Web. |
REMOTE_HOST | Il valore di questa variabile di ambiente contiene il nome host del client che richiede di CGI. In caso contrario si vuole controllare, non è necessario definire questa variabile di ambiente. |
REQUEST_METHOD | Esso fornisce un metodo chiamato script. Per script / protocollo HTTP 1.0 solo GET e POST significativo. |
SCRIPT_FILENAME | Il percorso completo di script CGI |
SCRIPT_NAME | Il nome dello script CGI |
SERVER_NAME | Questo è il nome host, alias, o l'indirizzo IP del server WEB. |
SERVER_SOFTWARE | Il valore di questa variabile di ambiente contiene la chiamata CGI nome del programma e il numero di versione del server HTTP. Ad esempio, il valore precedente di Apache / 2.2.14 (Unix) |
Ecco un semplice variabili d'ambiente di output CGI script CGI:
#!/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>"
Salvare i punti sopra test.py, e modificare i permessi dei file a 755, risultati di esecuzione sono i seguenti:
client browser al server per fornire informazioni in due modi, entrambi metodo è metodi GET e POST.
metodo GET per inviare le informazioni all'utente codificato al server, le informazioni di dati è contenuta nella URL della richiesta di pagina di numero diviso come segue "?":
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2GET richieste su alcuni degli altri commenti:
Quanto segue è un semplice URL, utilizzando il metodo GET per inviare due parametri per hello_get.py programma:
/cgi-bin/test.py?name=本教程&url=http://www.w3write.com
Un file di codice hello_get.py:
#!/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>"
Dopo aver salvato il hello_get.py modifica del file, modificare i permessi dei file a 755:
chmod 755 hello_get.py
Browser richiede di uscita:
Il seguente è un due inviare i dati al server utilizzando il metodo GET tramite un modulo HTML, presentato lo stesso file hello_get.py script del server, il codice hello_get è il seguente:
<!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>
Per impostazione predefinita, la directory cgi-bin può memorizzare solo un file di script, ci sarà sotto la directory test, modificare il file delle autorizzazioni hello_get memorizzati come 755:
chmod 755 hello_get
presentazione Gif è il seguente:
Utilizzando il metodo POST per passare i dati al server è più sicuro e affidabile, come alcuni informazioni sensibili come le password degli utenti devono usare POST per trasferire i dati.
Quello che segue è anche hello_get.py, si può anche gestire POST dati del modulo presentato dal browser:
#!/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>"
Di seguito è un modulo per inviare i dati al hello_get.py script del server con il metodo POST (method = "post"):
<!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>
presentazione Gif è il seguente:
casella di controllo utilizzato nel sottoporre uno o più dati di opzione, il codice HTML è il seguente:
<!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>
Un file di codice checkbox.py:
#!/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>"
Modificare le autorizzazioni checkbox.py:
chmod 755 checkbox.py
Browser accesso Gif grafici di presentazione:
Radio solo trasferire dati a un server, il codice HTML è il seguente:
<!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>
codice di script radiobutton.py è il seguente:
#!/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>"
Modificare le autorizzazioni radiobutton.py:
chmod 755 radiobutton.py
Browser accesso Gif grafici di presentazione:
passaggio Textarea più righe di dati al server, codice HTML è il seguente:
<!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"> 在这里输入内容it. </textarea> <input type="submit" value="提交" /> </form> </body> </html>
textarea.py codice di script è il seguente:
#!/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>"
Modificare le autorizzazioni textarea.py:
chmod 755 textarea.py
Browser accesso Gif grafici di presentazione:
codice casella a discesa HTML come segue:
<!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>
codice di script dropdown.py come segue:
#!/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>"
Modificare le autorizzazioni dropdown.py:
chmod 755 dropdown.py
Browser accesso Gif grafici di presentazione:
protocollo HTTP in un grande svantaggio è sbagliato giudicare l'identità di un utente, che danno ai programmatori una grande quantità di disagi, ma appare funzionalità cookie composta per questa carenza.
cookie che accede lo script mentre il cliente attraverso il browser del cliente sul disco rigido client per scrivere record di dati, recuperare dati quando un cliente visita il prossimo script, in modo da realizzare la funzione di determinare l'identità, biscotto comunemente utilizzato per verificare l'identità.
dei cookie HTTP viene inviato attraverso l'header HTTP da raggiungere, ha dovuto trasferire i file, la sintassi intestazione set-cookie è la seguente:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
Impostazioni cookie è molto semplice, biscotto verranno inviati separatamente intestazione http. L'esempio seguente imposta il nome e scade in un 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> """
Salvare il codice qui sopra per cookie_set.py, e modificare le autorizzazioni cookie_set.py:
chmod 755 cookie_set.py
Gli esempi precedenti utilizzano l'intestazione Set-Cookie per impostare le informazioni del cookie, impostare le opzioni Cookie altri attributi, come ad esempio la scadenza del termine, dominio Dominio, percorso percorso. Queste informazioni sono fornite: Prima di "Content-Type text / html".
Cookie pagina recupero delle informazioni è molto semplice, in CGI variabili d'ambiente HTTP_COOKIE, il formato di memorizzazione è la seguente informazione cookie viene memorizzato:
key1=value1;key2=value2;key3=value3itit
Ecco un semplice programma CGI per recuperare le informazioni dei cookie:
#!/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> """
Salvare il codice qui sopra per cookie_get.py, e modificare le autorizzazioni cookie_get.py:
chmod 755 cookie_get.py
Più colore impostazioni dei cookie Gif sono le seguenti:
file di impostazioni HTML per caricare necessario impostare l'attributo enctype al multipart / form-data, codice come segue:
<!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>
codice di file di script save_file.py è il seguente:
#!/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,)
Salvare il codice qui sopra per save_file.py, e modificare le autorizzazioni save_file.py:
chmod 755 save_file.py
Più colore impostazioni dei cookie Gif sono le seguenti:
Se si utilizza Unix / Linux, è necessario sostituire il separatore di file alla finestra solo bisogno di usare dichiarazione open () può essere:
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
Creiamo il file foo.txt nella directory corrente per scaricare il programma.
Scaricare il file impostando le informazioni di intestazione HTTP per implementare il codice funzione è la seguente:
#!/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()