Latest web development tutorials

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

cgiarch


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=value2
GET 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()