O melhor tutorial programação Python3 CGI em 2024. Neste tutorial você pode aprender O que é CGI,navegação na web,CGI Gráfico,configuração do servidor Web e suporte,O primeiro programa CGI,cabeçalho HTTP,Variáveis CGI Ambiente,Métodos GET e POST,CGI é usado biscoito,definições cookies,Recuperando informações do cookie,caixa de diálogo Download de arquivo,
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.
Para entender melhor como funciona CGI, podemos clicar em um link em uma página da web ou URL do processo:
programas CGI pode ser um script Python, script Perl, shell script, C ou programas em C ++.
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
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/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>')
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.
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 |
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/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>")
Salvar a pontos test.py acima, e modificar as permissões de arquivo para 755, os resultados da execução são as seguintes:
cliente do navegador para o servidor para fornecer informações de duas maneiras, sendo que ambos método é GET e POST métodos.
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:
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.w3write.com
Um arquivo hello_get.py código:
#!/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>")
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:
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 é a seguinte:
<!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>
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 armazenado como 755:
chmod 755 hello_get
apresentação Gif é a seguinte:
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/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>")
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>本教程(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> </form>
apresentação Gif é a seguinte:
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>本教程(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>
Um arquivo checkbox.py código:
#!/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>")
Modificar permissões checkbox.py:
chmod 755 checkbox.py
Navegador Acesso Gif cartas de apresentação:
Somente rádio transferir dados para um servidor, o código HTML é a seguinte:
<!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>
código de script radiobutton.py é a seguinte:
#!/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>")
Modificar permissões radiobutton.py:
chmod 755 radiobutton.py
Navegador Acesso Gif cartas de apresentação:
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>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/textarea.py" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容pt. </textarea> <input type="submit" value="提交" /> </form> </body> </html>
textarea.py código de script é a seguinte:
#!/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>")
Modificar permissões textarea.py:
chmod 755 textarea.py
Navegador Acesso Gif cartas de apresentação:
HTML código da caixa drop-down da seguinte forma:
<!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>
código de script dropdown.py da seguinte forma:
#!/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>")
Modificar permissões dropdown.py:
chmod 755 dropdown.py
Navegador Acesso Gif cartas de apresentação:
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.
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
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/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>本教程(w3write.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".
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=value3ptpt
Aqui está um programa CGI simples para recuperar informações do cookie:
#!/usr/bin/python3 # 导入模块 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> """)
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:
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>本教程(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>
Código save_file.py arquivo de script é a seguinte:
#!/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>本教程(w3write.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("\\", "/" ))
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/python3 # HTTP 头部 print ("Content-Disposition: attachment; filename=\"foo.txt\"") print () # 打开文件 fo = open("foo.txt", "rb") str = fo.read(); print (str) # 关闭文件 fo.close()