programação CGI Python
O que é CGI
CGI atualmente mantido por NCSA, NCSA CGI é definido da seguinte forma:
CGI (Common Gateway Interface), Common Gateway Interface, que é um programa em execução no servidor, tais como: servidor HTTP, a interface do cliente fornecendo a mesma página HTML.
navegação na web
Para entender melhor como funciona CGI, podemos clicar em um link em uma página da web ou URL do processo:
- 1, use o navegador para acessar a URL e se conectar ao servidor HTTP web.
- 2, servidor da Web recebe a mensagem de pedido será analisado URL e procurar arquivos acessados no servidor se houver, se houver para retornar o conteúdo do arquivo, caso contrário ele retorna uma mensagem de erro.
- 3, o navegador recebe as informações a partir do servidor e exibe as mensagens de arquivos ou erro recebido.
programas CGI pode ser um script Python, script Perl, shell script, C ou programas em C ++.
CGI Gráfico
configuração do servidor Web e suporte
Antes de realizar a programação CGI, certifique-se de que seu servidor Web tenha sido configurado para suportar CGI e manipulador de CGI.
Apache suporta configuração CGI:
Configure o diretório CGI:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Todos servidor HTTP para executar programas CGI são armazenados em um diretório pré-configurado. Este diretório é chamado o diretório CGI e, por convenção, é nomeado / var / www diretório / cgi-bin.
extensão .cgi arquivo CGI, python também pode usar a extensão .py.
Por padrão, a configuração do servidor Linux rodando diretório cgi-bin é / var / www.
Se você deseja especificar um diretório diferente para executar scripts CGI, você pode modificar o arquivo de configuração httpd.conf como segue:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
Adicionar AddHandler sufixo .py, para que possamos acessar o arquivo script python final py:
AddHandler cgi-script .cgi .pl .py
O primeiro programa CGI
Nós usamos Python para criar o primeiro programa CGI chamado hello.py, o arquivo está localizado em / var / www diretório / cgi-bin, da seguinte forma:
#!/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>'
Depois de salvar o hello.py modificação do arquivo, modificar as permissões de arquivo para 755:
chmod 755 hello.py
O programa acima é exibida no navegador para acessar os resultados são os seguintes:
O hello.py esse script é um script Python simples, o roteiro da primeira linha de saída "Content-type: text / html" para enviar para o tipo de navegador e dizer ao navegador para exibir o conteúdo como "text / html".
saída de impressão com uma linha em branco é usado para contar o final servidor da informação do cabeçalho.
cabeçalho HTTP
o conteúdo do arquivo hello.py em: parte do cabeçalho HTTP é "Content-type text / html", que será enviado para o tipo de conteúdo do navegador diz que os arquivos do navegador.
formato do cabeçalho HTTP é a seguinte:
HTTP 字段名: 字段内容
Por exemplo:
Content-type: text/html
A tabela a seguir descreve as informações contidas nos programas CGI de cabeçalhos HTTP são frequentemente utilizados:
cabeça | descrição |
---|---|
Content-type: | MIME entidade correspondente ao pedido de informação. Por exemplo: Content-type: text / html |
Expira: Data | data e tempo de resposta expirou |
Localização: URL | Para redirecionar o destinatário a um pedido não-localização URL para completar o pedido ou identificação de novos recursos |
Última modificação: Data | recurso solicitado foi modificada pela última vez |
Content-length: N | pedido Content-Length |
Set-Cookie: String | configurações http biscoito |
Variáveis CGI Ambiente
Todos os programas CGI ter recebido as seguintes variáveis de ambiente, que desempenharam um papel importante no programa CGI:
nome da variável | descrição |
---|---|
CONTENT_TYPE | Este valor indica que a variável de ambiente para o tipo MIME de transferência de informação. No momento, as variáveis de ambiente são geralmente CONTENT_TYPE: application / x-www-form-urlencoded, ele disse que os dados do formulário HTML. |
CONTENT_LENGTH | Se as informações do servidor modo de transferência e um programa CGI é POST, mesmo se o ambiente de entrada de STDIN variável o número de bytes que podem ser lidos dados válidos do padrão. Esta variável ambiente durante a leitura os dados de entrada devem ser usadas. |
HTTP_COOKIE | conteúdo BOLINHO dentro do cliente. |
HTTP_USER_AGENT | O fornecimento de informações inclui o número da versão do navegador do cliente ou outros dados proprietários. |
PATH_INFO | O valor dessa variável de ambiente indica o nome do programa CGI imediatamente após as informações do caminho adicional. Muitas vezes aparece como um programa de argumento CGI. |
QUERY_STRING | Se as informações do servidor modo de transferência e um programa CGI é uma informação GET, o valor dessa variável de ambiente mesmo se passou. Esta informação é seguido pelo nome do programa CGI, tanto no meio com um ponto de interrogação '?' Separador. |
REMOTE_ADDR | O valor desta variável de ambiente é o endereço IP do cliente envia um pedido, por exemplo, o 192.168.1.67 acima. Este valor está sempre presente. E é a necessidade de fornecer o cliente Web para o identificador único do servidor Web pode ser utilizada em programas CGI para distinguir entre diferentes cliente Web. |
REMOTE_HOST | O valor dessa variável de ambiente contém o nome do host do cliente solicitante de CGI. Se ele não quiser verificar, você não precisa definir esta variável de ambiente. |
REQUEST_METHOD | Ele fornece um método chamado script. Para script / protocolo HTTP 1.0 única GET e POST significativa. |
SCRIPT_FILENAME | O caminho completo para os scripts CGI |
SCRIPT_NAME | O nome do script CGI |
SERVER_NAME | Este é o nome do host, alias ou endereço de IP do seu servidor Web. |
SERVER_SOFTWARE | O valor dessa variável de ambiente contém a chamada CGI nome do programa e número de versão do servidor HTTP. Por exemplo, o valor acima do Apache / 2.2.14 (Unix) |
Aqui está um script CGI simples variáveis de ambiente CGI saída:
#!/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>"
Salvar a pontos test.py acima, e modificar as permissões de arquivo para 755, os resultados da execução são as seguintes:
Métodos GET e POST
cliente do navegador para o servidor para fornecer informações de duas maneiras, sendo que ambos método é GET e POST métodos.
Use o método GET de transferência de dados
método GET para enviar as informações do usuário codificado para o servidor, as informações de dados está contido no URL da solicitação de página para o número dividido da seguinte forma "?":
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2GET pedidos sobre alguns dos outros comentários:
- GET pedido pode ser armazenado em cache
- solicitação GET permanece no histórico do navegador
- Recebo pedidos podem ser marcadas
- Recebo pedidos não deve ser utilizado quando se lida com dados sensíveis
- Recebo pedidos têm restrições de comprimento
- Recebo pedidos só deve ser usado para recuperar dados
Exemplos de simples url: método GET
O que se segue é uma URL simples, usando o método GET para enviar dois parâmetros para hello_get.py programa:
/cgi-bin/test.py?name=本教程&url=http://www.w3big.com
Um arquivo hello_get.py código:
#!/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>"
Depois de salvar o hello_get.py modificação do arquivo, modificar as permissões de arquivo para 755:
chmod 755 hello_get.py
Navegador solicita saída:
Exemplos de forma simples: método GET
Segue-se um período de dois enviar dados para o servidor usando o método GET através de um formulário HTML, apresentou o mesmo arquivo hello_get.py script de servidor, código hello_get.html é a seguinte:
<!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>
Por padrão, o diretório cgi-bin só pode armazenar um arquivo de script, estaremos sob o diretório teste, modificar o arquivo permissões hello_get.html armazenado como 755:
chmod 755 hello_get.html
apresentação Gif é a seguinte:
Use o método POST para passar dados
Usando o método POST para passar dados para o servidor é mais seguro e confiável, como algumas informações confidenciais, como senhas de usuários precisa usar POST para transferir dados.
O seguinte também é hello_get.py, ele também pode lidar com dados de formulário POST apresentados pelo navegador:
#!/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>"
A seguir é uma forma de enviar os dados para o hello_get.py script de servidor através do método 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>
apresentação Gif é a seguinte:
programa CGI para transmitir dados através da caixa de seleção
checkbox usado para enviar um ou mais dados de opção, o código HTML é a seguinte:
<!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>
Um arquivo checkbox.py código:
#!/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>"
Modificar permissões checkbox.py:
chmod 755 checkbox.py
Navegador Acesso Gif cartas de apresentação:
a transferência de dados de rádio via programa CGI
Somente rádio transferir dados para um servidor, o código HTML é a seguinte:
<!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>
código de script radiobutton.py é a seguinte:
#!/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>"
Modificar permissões radiobutton.py:
chmod 755 radiobutton.py
Navegador Acesso Gif cartas de apresentação:
transferir dados textarea via programa CGI
passe textarea várias linhas de dados para o servidor, o código HTML é a seguinte:
<!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 código de script é a seguinte:
#!/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>"
Modificar permissões textarea.py:
chmod 755 textarea.py
Navegador Acesso Gif cartas de apresentação:
Drop-down passam dados através do programa CGI.
HTML código da caixa drop-down da seguinte forma:
<!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>
código de script dropdown.py da seguinte forma:
#!/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>"
Modificar permissões dropdown.py:
chmod 755 dropdown.py
Navegador Acesso Gif cartas de apresentação:
CGI é usado biscoito
protocolo HTTP em uma grande desvantagem é errado julgar a identidade de um usuário, o que dar aos programadores uma grande quantidade de inconveniência, mas parece funcionalidade de cookies compensou essa deficiência.
cookie que está acessando o script enquanto o cliente através do browser do cliente no disco rígido do cliente para escrever registros de dados, recuperar dados quando um cliente visita o próximo script, de modo a alcançar a função de determinar a identidade, biscoito comumente usado na verificação de identidade.
sintaxe bolinho
cookies HTTP é enviado através do cabeçalho HTTP para alcançar, ele teve de transferir arquivos, sintaxe de cabeçalho set-cookie é a seguinte:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
- name = name: para definir o valor do cookie (o nome não pode ser usado "," e "," número), quando há vários valores de nome ";" para separar, por exemplo: name1 = name1; name2 = name2 ; nome3 = nome3.
- expira = Data: biscoito data de expiração no formato: expira = "Wdy, DD Mon-AAAA HH: MM: SS"
- path = caminho: o caminho definido o suporte a cookies, se o caminho é um caminho, o cookie para todos os arquivos e subdiretórios do diretório entrada em vigor, por exemplo: path = "/ cgi-bin /", se o caminho é um arquivo, biscoito refere-se à entrada em vigor deste arquivo, por exemplo: path = "/ cgi-bin / cookie.cgi".
- domain = domínio: o nome de domínio do cookie é válido, por exemplo: domain = "www.w3big.com"
- seguro: Se este sinalizador é dada, que o cookie só pode ser transmitido através do servidor https protocolo SSL.
- cookie é recebido, definindo as variáveis de ambiente HTTP_COOKIE alcançado, programas CGI podem obter informações recuperando a variável cookie.
definições cookies
Definições cookies é muito simples, biscoito será enviado separadamente no cabeçalho HTTP. O exemplo a seguir define o nome e expira em um 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>本教程(w3big.com)</title> </head> <body> <h1>Cookie set OK!</h1> </body> </html> """
Salve o código acima para cookie_set.py, e modificar permissões cookie_set.py:
chmod 755 cookie_set.py
Os exemplos acima usam o cabeçalho Set-Cookie para definir as informações Cookie, opções de conjunto de cookies outros atributos, tais como a expiração de tempo expirar, o domínio Domínio, Path Path. Esta informação é fornecida: Antes de "Content-type text / html".
Recuperando informações do cookie
Biscoito página de recuperação de informação é muito simples, no CGI variáveis de ambiente HTTP_COOKIE, o formato de armazenamento é a seguinte informações de cookie é armazenado:
key1=value1;key2=value2;key3=value3....
Aqui está um programa CGI simples para recuperar informações do 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>本教程(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> """
Salve o código acima para cookie_get.py, e modificar permissões cookie_get.py:
chmod 755 cookie_get.py
Mais cor configurações de cookie Gif são os seguintes:
Exemplos de upload de arquivos
arquivo de configurações de HTML para fazer upload precisa definir o atributo enctype para multipart / form-data, o código da seguinte forma:
<!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>
Código save_file.py arquivo de script é a seguinte:
#!/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>本教程(w3big.com)</title> </head> <body> <p>%s</p> </body> </html> """ % (message,)
Salve o código acima para save_file.py, e modificar permissões save_file.py:
chmod 755 save_file.py
Mais cor configurações de cookie Gif são os seguintes:
Se você estiver usando Unix / Linux, você deve substituir o separador de arquivo para a janela só precisa usar declaração open () pode ser:
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
caixa de diálogo Download de arquivo
Criamos arquivo foo.txt no diretório atual para fazer o download do programa.
Faça o download do arquivo, definindo as informações de cabeçalho HTTP para implementar o código de função é a seguinte:
#!/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()