Latest web development tutorials

la programación CGI Python

¿Qué es CGI

CGI actualmente mantenido por NCSA, NCSA CGI se define como sigue:

CGI (Common Gateway Interface), Common Gateway Interface, que es un programa que se ejecuta en el servidor, como por ejemplo: servidor HTTP, la interfaz del cliente proporcionando la misma página HTML.


navegación web

Para entender mejor cómo funciona CGI, podemos hacer clic en un enlace en una página web o URL del proceso:

  • 1, utilizar el navegador para acceder a la URL y conectarse con el servidor web HTTP.
  • 2, el servidor Web recibe el mensaje de solicitud será analizada URL y buscar los archivos a los que accede en el servidor si hay, si hay que devolver el contenido del archivo, de lo contrario, devuelve un mensaje de error.
  • 3, el navegador recibe la información desde el servidor y muestra los mensajes de error o de archivos recibidos.

Los programas CGI pueden ser una secuencia de comandos de Python, Perl guión, script de shell, los programas de C o C ++.


Gráfico CGI

cgiarch


configuración del servidor web y el apoyo

Antes de realizar la programación CGI, asegúrese de que el servidor Web se ha configurado para soportar CGI y controlador CGI.

Apache soporta la configuración CGI:

Configurar el directorio CGI:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

Todo servidor HTTP para ejecutar programas CGI se almacenan en un directorio preconfigurado. Este directorio se llama el directorio CGI, y por convención, se nombra directorio / var / www / cgi-bin.

archivo CGI extensión .cgi, pitón también puede utilizar la extensión .py.

Por defecto, la configuración del servidor Linux corriendo directorio cgi-bin es / var / www.

Si desea especificar un directorio diferente para ejecutar scripts CGI, puede modificar el archivo de configuración httpd.conf de la siguiente manera:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI
   Order allow,deny
   Allow from all
</Directory>

Añadir .py AddHandler sufijo, por lo que podemos acceder al archivo de secuencia de comandos Python .py final:

AddHandler cgi-script .cgi .pl .py

El primer programa CGI

Utilizamos Python para crear el primer programa CGI llamado hello.py, el archivo se encuentra en el directorio / var / www / cgi-bin, de la siguiente manera:

#!/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>'

Después de guardar el hello.py modificación del archivo, modificar los permisos de archivo a 755:

chmod 755 hello.py 

El programa anterior se muestra en el navegador para acceder a los resultados son los siguientes:

El hello.py este script es un simple script en Python, el guión de la primera línea de salida "Content-type: text / html" para enviar al tipo de navegador y decirle al navegador para visualizar el contenido como "text / html".

La salida de impresión con una línea en blanco se utiliza para indicar el extremo del servidor de la información de cabecera.


cabecera HTTP

el contenido del archivo en hello.py: parte de la cabecera HTTP es "Content-type text / html", que será enviado al tipo de contenido del navegador le dice a los archivos del navegador.

formato de la cabecera HTTP es el siguiente:

HTTP 字段名: 字段内容

Por ejemplo:

Content-type: text/html

En la siguiente tabla se describe la información de los programas CGI de cabecera HTTP se utilizan a menudo:

cabeza descripción
Content-type: MIME entidad correspondiente a la solicitud de información. Por ejemplo: Content-type: text / html
Expira: Fecha fecha y tiempo de respuesta caducado
Localización: URL Para redirigir el destinatario de una solicitud no ubicación URL para completar la solicitud o la identificación de nuevos recursos
-Modificado: Fecha recurso solicitado fue modificada por última vez
Content-Length: N solicitud de Content-Length
Set-Cookie: String http configuración de cookies

Variables de entorno CGI

Todos los programas CGI han recibido las siguientes variables de entorno, que desempeñaron un papel importante en el programa CGI:

nombre de la variable descripción
CONTENT_TYPE Este valor indica que la variable de entorno para el tipo MIME de transferencia de información. En la actualidad, las variables de entorno son generalmente CONTENT_TYPE: urlencoded-x-www-formulario de solicitud /, dijo que los datos del formulario HTML.
CONTENT_LENGTH Si la información del servidor y el modo de transferencia de programa CGI es POST, aunque el entorno STDIN variables el número de bytes que se pueden leer datos válidos de la norma. Esta variable de entorno al leer los datos de entrada debe ser utilizado.
HTTP_COOKIE contenido de las cookies dentro del cliente.
HTTP_USER_AGENT Proporcionar información incluye el número de versión del navegador del cliente u otros datos de propiedad.
PATH_INFO El valor de esta variable de entorno indica el nombre del programa CGI inmediatamente después de la información de la ruta adicional. A menudo aparece como un programa argumento CGI.
QUERY_STRING Si la información del servidor y el modo de transferencia de información de programa CGI es GET, el valor de esta variable de entorno, incluso si se aprueba. Esta información es seguido por el nombre del programa CGI, tanto en el medio con un signo de interrogación "?" Separador.
REMOTE_ADDR El valor de esta variable de entorno es la dirección IP del cliente envía una petición, por ejemplo, el 192.168.1.67 anteriormente. Este valor está siempre presente. Y es la necesidad de proporcionar al cliente Web para el identificador único del servidor Web se puede utilizar en los programas CGI para distinguir entre diferentes cliente Web.
REMOTE_HOST El valor de esta variable de entorno contiene el nombre de host del cliente solicitante de CGI. Si no lo hace usted quiere comprobar, no es necesario definir esta variable de entorno.
REQUEST_METHOD Proporciona un método llamado guión. Para HTTP script / 1.0 protocolo sólo GET y POST significativa.
SCRIPT_FILENAME La ruta completa a los scripts CGI
SCRIPT_NAME El nombre de la secuencia de comandos CGI
NOMBRE_SERVIDOR Este es el nombre de host, alias o dirección IP de su servidor web.
SERVER_SOFTWARE El valor de esta variable de entorno contiene el nombre del programa CGI llamada y número de versión del servidor HTTP. Por ejemplo, el valor anterior de Apache / 2.2.14 (Unix)

Aquí es una simple salida de variables de entorno 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>"

Guarde el test.py puntos por encima, y ​​modificar los permisos de archivo a 755, los resultados de ejecución son los siguientes:


Métodos GET y POST

cliente del navegador al servidor para entregar información de dos maneras, tanto del método que se métodos GET y POST.

Utilice el método GET de la transferencia de datos

GET método para enviar al usuario información codificada al servidor, la información de datos está contenida en la URL de la petición de la página de número dividido de la siguiente manera "?":

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
Peticiones GET sobre algunos de los otros comentarios:
  • GET solicitud puede ser almacenado en caché
  • solicitud GET permanece en el historial del navegador
  • Peticiones GET se pueden marcar
  • Peticiones GET no se deben utilizar cuando se trata de datos sensibles
  • Peticiones GET tienen restricciones de longitud
  • Peticiones GET sólo se deben usar para recuperar datos

Ejemplos de URL simple: Obtiene el método

El siguiente es un enlace simple, utilizando el método GET para enviar dos parámetros para hello_get.py programa:

/cgi-bin/test.py?name=本教程&url=http://www.w3big.com

Un archivo de código 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>"

Después de guardar el hello_get.py modificación del archivo, modificar los permisos de archivo a 755:

chmod 755 hello_get.py 

El navegador solicita de salida:

Ejemplos de forma sencilla: GET método

La siguiente es una de dos enviar los datos al servidor utilizando el método GET a través de un formulario HTML, presentado el mismo archivo hello_get.py script del servidor, código hello_get.html es el siguiente:

<!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>

De forma predeterminada, el directorio cgi-bin sólo puede almacenar un archivo de secuencia de comandos, que estará bajo el directorio de prueba, modificar el archivo de permisos hello_get.html almacenan como 755:

chmod 755 hello_get.html

presentación Gif es el siguiente:

Utilizar el método POST para pasar datos

Utilizando el método POST para pasar los datos al servidor es más seguro y fiable, como alguna información confidencial, como contraseñas de los usuarios necesitan utilizar POST para transferir datos.

El siguiente es también hello_get.py, sino que también puede manejar los datos del formulario POST enviados por el 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 continuación se presenta un formulario para enviar datos a la secuencia de comandos del servidor en los hello_get.py 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>

presentación Gif es el siguiente:

programa CGI para pasar datos a través de la casilla de verificación

casilla de verificación utilizado para enviar uno o más datos de la opción, el código HTML es el siguiente:

<!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 archivo de código 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>"

Modificar los permisos checkbox.py:

chmod 755 checkbox.py

Acceso a la navegación GIF gráficos de presentación:

la transferencia de datos a través de la radio programa CGI

Sólo en la radio transferir datos a un servidor, el código HTML es el siguiente:

<!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 es el siguiente:

#!/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 los permisos radiobutton.py:

chmod 755 radiobutton.py

Acceso a la navegación GIF gráficos de presentación:

la transferencia de datos a través de área de texto programa CGI

pase Textarea varias filas de datos al servidor, código HTML es como sigue:

<!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 es el siguiente:

#!/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 los permisos textarea.py:

chmod 755 textarea.py

Acceso a la navegación GIF gráficos de presentación:

Desplegable datos pasan por el programa CGI.

código de la caja desplegable HTML de la siguiente manera:

<!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 como sigue:

#!/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 los permisos dropdown.py:

chmod 755 dropdown.py

Acceso a la navegación GIF gráficos de presentación:


CGI se utiliza Cookies

protocolo http en un gran inconveniente es erróneo juzgar la identidad de un usuario, que dan a los programadores una gran cantidad de inconvenientes, pero aparece la función de cookies compensaba esta deficiencia.

cookie que se accede a la secuencia de comandos mientras el cliente a través del navegador del cliente en el disco duro del cliente para escribir registros de datos, recuperar datos cuando un cliente visita la siguiente secuencia de comandos, a fin de lograr la función de determinar la identidad, galleta utiliza comúnmente en la verificación de identidad.

la sintaxis de la galleta

cookies HTTP se envía a través de la cabecera HTTP para lograr, tuvo que transferir archivos, sintáctica de cabecera Set-Cookie es el siguiente:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = nombre: para ajustar el valor de la cookie (nombre no puede ser utilizado "," y "," número), cuando hay varios valores de nombre ";" para separar, por ejemplo: nombre1 = nombre1, nombre2 = nombre2 ; nombre3 = nombre3.
  • expira = Fecha: Galleta de la fecha de caducidad en el formato: expira = "Wdy, DD HH Lu-AAAA: MM: SS"
  • path = camino: el camino trazado soporte para cookies, si la ruta es una ruta, la cookie para todos los archivos y subdirectorios de la entrada de directorio en vigor, por ejemplo: path = "/ cgi-bin /", si la ruta es un archivo, galleta se refiere a la entrada en vigor de este archivo, por ejemplo: path = "/ cgi-bin / cookie.cgi".
  • domain = Dominio: el nombre de dominio de la cookie es válida, por ejemplo: domain = "www.w3big.com"
  • asegurar: Si se da esta bandera, que la cookie sólo puede ser transmitido a través del servidor https protocolo SSL.
  • cookie se recibió mediante el establecimiento de variables de entorno HTTP_COOKIE logra, programas CGI pueden obtener información mediante la recuperación de la variable de galletas.

ajustes de cookies

Ajustes de cookies es muy simple, galleta se enviarán por separado en el encabezado HTTP. El ejemplo siguiente define el nombre y termina en una 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>
"""

Guarde el código anterior para cookie_set.py, y modificar los permisos cookie_set.py:

chmod 755 cookie_set.py

Los ejemplos anteriores usan la cabecera Set-Cookie para establecer la información de la galleta, galleta opciones establecen otros atributos, como la expiración de tiempo expira, el dominio de dominio, Ruta Ruta. Esta información se proporciona: Antes de "Content-type text / html".


Recuperación de información de la galleta

Cookie de la página de recuperación de información es muy simple, en el CGI variables de entorno HTTP_COOKIE, el formato de almacenamiento es de la siguiente información de cookie se almacena:

key1=value1;key2=value2;key3=value3....

Aquí es un programa CGI sencilla para recuperar información de las cookies:

#!/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>

"""

Guarde el código anterior para cookie_get.py, y modificar los permisos cookie_get.py:

chmod 755 cookie_get.py

Más color configuración Gif galletas son los siguientes:

Ejemplos de la carga de archivos

archivo de configuración HTML para cargar necesitan para establecer el atributo enctype en multipart / form-data, el código de la siguiente manera:

<!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 de archivo de script save_file.py es el siguiente:

#!/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,)

Guarde el código anterior para save_file.py, y modificar los permisos save_file.py:

chmod 755 save_file.py

Más color configuración Gif galletas son los siguientes:

Si se está utilizando Unix / Linux, debe reemplazar el separador de archivos en la ventana sólo tendrá que utilizar la declaración abierta () puede ser:

fn = os.path.basename(fileitem.filename.replace("\\", "/" ))

cuadro de diálogo Descarga de archivos

Creamos archivo foo.txt en el directorio actual para descargar el programa.

Descargar el archivo mediante el establecimiento de la información de cabecera HTTP para poner en práctica el código de función es la siguiente:

#!/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()