Latest web development tutorials

programmazione python3 CGI

Qual è CGI

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.


navigazione Web

Per capire meglio come funziona la CGI, siamo in grado di cliccare su un link in una pagina web o un URL del processo:

  • 1, utilizzare il browser per accedere all'URL e connettersi al server Web HTTP.
  • 2, il server Web riceve il messaggio di richiesta sarà analizzata URL e guardare file acceduti sul server se c'è, se c'è da restituire il contenuto del file, altrimenti restituisce un messaggio di errore.
  • 3, il browser riceve le informazioni dal server e visualizza i messaggi di file o di errore ricevuti.

programmi CGI possono essere uno script Python, script in Perl, shell script, programmi C o C ++.


Grafico CGI

cgiarch


configurazione del server Web e il supporto

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

Il primo programma CGI

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/python3

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.


HTTP

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

Variabili CGI ambiente

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/python3

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:


GET e POST metodi

client browser al server per fornire informazioni in due modi, entrambi metodo è metodi GET e POST.

Utilizzare il metodo GET di trasferimento dei dati

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=value2
GET richieste su alcuni degli altri commenti:
  • GET richiesta può essere memorizzato nella cache
  • richiesta GET rimane nella cronologia del browser
  • GET richieste possono essere contrassegnate
  • GET richieste non devono essere utilizzati quando si tratta di dati sensibili
  • GET richieste hanno limiti di lunghezza
  • GET richieste devono essere usati solo per recuperare i dati

Esempi di URL semplice: metodo GET

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.w3big.com

Un file di codice hello_get.py:

#!/usr/bin/python3

# 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:

Esempi di forma semplice: metodo GET

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.html è il seguente:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.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.html memorizzati come 755:

chmod 755 hello_get.html

presentazione Gif è il seguente:

Utilizzare il metodo POST per passare i dati

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/python3

# 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>本教程(w3big.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>
</form>

presentazione Gif è il seguente:

programma CGI di passare i dati attraverso la casella di controllo

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>本教程(w3big.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/python3

# 引入 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:

il trasferimento di dati via radio programma CGI

Radio solo trasferire dati a un server, il codice HTML è il seguente:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.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/python3

# 引入 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:

il trasferimento dei dati tramite textarea programma CGI

passaggio Textarea più righe di dati al server, codice HTML è il seguente:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/textarea.py" method="post" target="_blank">
<textarea name="textcontent" cols="40" rows="4">
在这里输入内容...
</textarea>
<input type="submit" value="提交" />
</form>
</body>
</html>

textarea.py codice di script è il seguente:

#!/usr/bin/python3

# 引入 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:

Discesa i dati passano attraverso il programma CGI.

codice casella a discesa HTML come segue:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.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/python3

# 引入 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:


CGI è usata Cookie

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à.

sintassi biscotto

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 
  • name = Nome: per impostare il valore del cookie (nome non può essere utilizzato "," e "," numero), quando ci sono più valori nome ";" per separare, ad esempio: nome1 = nome1; nome2 = nome2 ; NAME3 = NAME3.
  • scade = Data: biscotto data di scadenza nel formato: scade = "GMG, DD Mon-AAAA HH: MM: SS"
  • path = percorso: il percorso impostato il supporto dei cookie, se il percorso è un percorso, il cookie per tutti i file e le sottodirectory della voce di directory in vigore, ad esempio: PATH = "/ cgi-bin /", se il percorso è un file, biscotto Si riferisce alla data di entrata in vigore di questo file, ad esempio: PATH = "/ cgi-bin / cookie.cgi".
  • domain = dominio: il nome di dominio del cookie è valido, ad esempio: domain = "www.w3big.com"
  • garantire: Se viene dato questo flag, che il cookie può essere trasmesso solo attraverso server HTTPS protocollo SSL.
  • cookie viene ricevuto impostando le variabili d'ambiente HTTP_COOKIE raggiunto, i programmi CGI possono ottenere informazioni recuperando la variabile biscotto.

impostazioni dei cookie

Impostazioni cookie è molto semplice, biscotto verranno inviati separatamente intestazione http. L'esempio seguente imposta il nome e scade in un cookie:

#!/usr/bin/python3
# 
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>本教程(w3big.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".


Recupero di informazioni sui cookie

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=value3....

Ecco un semplice programma CGI per recuperare le informazioni dei cookie:

#!/usr/bin/python3

# 导入模块
import os
import Cookie

print ("Content-type: text/html")
print ()

print ("""
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.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:

Esempi di caricamento di file

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>本教程(w3big.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/python3

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>本教程(w3big.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("\\", "/" ))

finestra di dialogo Download del file

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/python3

# HTTP 头部
print ("Content-Disposition: attachment; filename=\"foo.txt\"")
print ()
# 打开文件
fo = open("foo.txt", "rb")

str = fo.read();
print (str)

# 关闭文件
fo.close()