python3 programación CGI
¿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
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/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>')
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/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>")
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=value2Peticiones 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/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>")
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/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 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> </form>
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/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 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/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 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/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 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/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 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/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> """)
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/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> """)
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/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,))
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/python3 # HTTP 头部 print ("Content-Disposition: attachment; filename=\"foo.txt\"") print () # 打开文件 fo = open("foo.txt", "rb") str = fo.read(); print (str) # 关闭文件 fo.close()