<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://wiki.cabal.mx/index.php?action=history&amp;feed=atom&amp;title=C%C3%B3mo_usar_Python_en_la_web</id>
	<title>Cómo usar Python en la web - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cabal.mx/index.php?action=history&amp;feed=atom&amp;title=C%C3%B3mo_usar_Python_en_la_web"/>
	<link rel="alternate" type="text/html" href="https://wiki.cabal.mx/index.php?title=C%C3%B3mo_usar_Python_en_la_web&amp;action=history"/>
	<updated>2026-04-04T18:28:13Z</updated>
	<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
	<generator>MediaWiki 1.32.1</generator>
	<entry>
		<id>https://wiki.cabal.mx/index.php?title=C%C3%B3mo_usar_Python_en_la_web&amp;diff=4474&amp;oldid=prev</id>
		<title>Patricio Páez: Categorías</title>
		<link rel="alternate" type="text/html" href="https://wiki.cabal.mx/index.php?title=C%C3%B3mo_usar_Python_en_la_web&amp;diff=4474&amp;oldid=prev"/>
		<updated>2012-12-24T13:47:35Z</updated>

		<summary type="html">&lt;p&gt;Categorías&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Borrador}}&lt;br /&gt;
&lt;br /&gt;
Python puede usarse para implementar servidores, clientes y aplicaciones de web.&lt;br /&gt;
&lt;br /&gt;
= La librería estándar =&lt;br /&gt;
La líbrería estándar de Python include los módulos &amp;#039;&amp;#039;http.server&amp;#039;&amp;#039;, &amp;#039;&amp;#039;http.client&amp;#039;&amp;#039; y &amp;#039;&amp;#039;cgi&amp;#039;&amp;#039;. En las siguientes secciones se muestran ejemplos mínimos del uso de estos módulos.  Todos los ejemplos se encuentran en el repositorio [https://github.com/ppaez/python-in-the-web python-in-the-web] en github.&lt;br /&gt;
&lt;br /&gt;
== Servidor ==&lt;br /&gt;
Un servidor HTTP mínimo puede hacerse con el módulo &amp;lt;code&amp;gt;http.server&amp;lt;/code&amp;gt; así:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
from http.server import HTTPServer, SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
PORT = 1234&lt;br /&gt;
server_address = (&amp;#039;localhost&amp;#039;, PORT)&lt;br /&gt;
&lt;br /&gt;
Handler = SimpleHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
httpd = HTTPServer(server_address, Handler)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;servidor en puerto&amp;quot;, PORT)&lt;br /&gt;
httpd.serve_forever()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se corre así:&lt;br /&gt;
 $ python3 servidor.py&lt;br /&gt;
 servidor en puerto 1234&lt;br /&gt;
&lt;br /&gt;
El servidor genera un listado de los archivos en la carpeta actual.  Si existe un archivo &amp;#039;&amp;#039;index.html&amp;#039;&amp;#039; en la carpeta actual, se va a mostrar su contenido en lugar del listado de archivos.  Podemos comprobarlo ejecutando:&lt;br /&gt;
 $ echo Página principal &amp;gt; index.html&lt;br /&gt;
Ahora al visitar o cargar de nuevo &amp;lt;code&amp;gt;localhost:1234&amp;lt;/code&amp;gt; veremos &amp;#039;&amp;#039;Página principal&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
El programa despliega un renglón en la consola por cada petición HTTP que atiende.  En el ejemplo abajo el primer renglón es cuando se escribió &amp;lt;code&amp;gt;localhost:1234&amp;lt;/code&amp;gt; en el navegador.  Los dos siguientes renglones son porque se escribió &amp;lt;code&amp;gt;localhost:1234/noexiste&amp;lt;/code&amp;gt; en el navegador:&lt;br /&gt;
 127.0.0.1 - - [29/Sep/2012 17:35:34] &amp;quot;GET / HTTP/1.1&amp;quot; 200 -&lt;br /&gt;
 127.0.0.1 - - [29/Sep/2012 17:36:06] code 404, message File not found&lt;br /&gt;
 127.0.0.1 - - [29/Sep/2012 17:36:06] &amp;quot;GET /noexiste HTTP/1.1&amp;quot; 404 -&lt;br /&gt;
&lt;br /&gt;
== Common Gateway Interface ==&lt;br /&gt;
Es posible implementar tanto un servidor que ejecuta CGI como scripts CGI. Para un servidor CGI solo tenemos que remplazar el Handler &amp;#039;&amp;#039;SimpleHTTPRequestHandler&amp;#039;&amp;#039; por &amp;#039;&amp;#039;CGIHTTPRequestHandler&amp;#039;&amp;#039; en el ejemplo anterior:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
from http.server import HTTPServer, CGIHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
PORT = 1234&lt;br /&gt;
server_address = (&amp;#039;localhost&amp;#039;, PORT)&lt;br /&gt;
&lt;br /&gt;
Handler = CGIHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
httpd = HTTPServer(server_address, Handler)&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;servidor con CGI en puerto&amp;quot;, PORT)&lt;br /&gt;
httpd.serve_forever()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se corre así:&lt;br /&gt;
 $ python3 server_cgi.py&lt;br /&gt;
   servidor con CGI en puerto 1234&lt;br /&gt;
Este servidor mostrará los documentos en la carpeta actual como el servidor anterior, pero además ejecutará un archivo *.py o *.pyw que sea ejecutable y esté en alguna de las carpetas &amp;#039;&amp;#039;cgi-bin/&amp;#039;&amp;#039; o &amp;#039;&amp;#039;htbin/&amp;#039;&amp;#039; dentro del directorio actual.  Estas carpetas predeterminadas se pueden cambiar modificando la lista &amp;lt;code&amp;gt;http.server.cgi_directories&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Un script CGI mínimo sería:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
&lt;br /&gt;
import cgitb&lt;br /&gt;
cgitb.enable()&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Content-Type: text/plain;charset=utf-8&amp;quot;)&lt;br /&gt;
print()&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;¡Hola Mundo!&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Los comandos &amp;lt;code&amp;gt;import cgitb&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;cgitb.enable()&amp;lt;/code&amp;gt; son para que el script emita mensajes de depuración en caso de que algo falle, en lugar de que no envíe ninguna salida.&lt;br /&gt;
&lt;br /&gt;
Si al script CGI lo llamamos &amp;#039;&amp;#039;hola.py&amp;#039;&amp;#039; en la carpeta &amp;#039;&amp;#039;cgi-bin/&amp;#039;&amp;#039;, y lo hacemos ejecutable con &amp;lt;code&amp;gt;chmod u+x cgi-bin/hola.py&amp;lt;/code&amp;gt;, se puede navegar a la ruta &amp;lt;code&amp;gt;localhost:1234/cgi-bin/hola.py&amp;lt;/code&amp;gt; para obtener &amp;lt;code&amp;gt;¡Hola Mundo!&amp;lt;/code&amp;gt; como resultado.&lt;br /&gt;
&lt;br /&gt;
Estas son algunas de las líneas que envía a la consola el servidor con CGI para diferentes casos:&lt;br /&gt;
 127.0.0.1 - - [01/Oct/2012 20:44:24] &amp;quot;GET / HTTP/1.1&amp;quot; 200 -&lt;br /&gt;
 127.0.0.1 - - [01/Oct/2012 20:45:10] &amp;quot;GET /cgi-bin/hola.py HTTP/1.1&amp;quot; 200 -&lt;br /&gt;
 127.0.0.1 - - [01/Oct/2012 20:44:47] code 403, message CGI script is not a plain file (&amp;#039;/cgi-bin/&amp;#039;)&lt;br /&gt;
 127.0.0.1 - - [01/Oct/2012 20:44:47] &amp;quot;GET /cgi-bin/ HTTP/1.1&amp;quot; 403 -&lt;br /&gt;
 127.0.0.1 - - [01/Oct/2012 20:44:59] code 404, message No such CGI script (&amp;#039;/cgi-bin/noexiste&amp;#039;)&lt;br /&gt;
 127.0.0.1 - - [01/Oct/2012 20:44:59] &amp;quot;GET /cgi-bin/noexiste HTTP/1.1&amp;quot; 404 -&lt;br /&gt;
 127.0.0.1 - - [01/Oct/2012 20:56:20] code 403, message CGI script is not executable (&amp;#039;/cgi-bin/noejecutable&amp;#039;)&lt;br /&gt;
 127.0.0.1 - - [01/Oct/2012 20:57:18] &amp;quot;GET /cgi-bin/nopy HTTP/1.1&amp;quot; 200 -&lt;br /&gt;
 Traceback (most recent call last):&lt;br /&gt;
   File &amp;quot;/home/pp/lib/python3.3/http/server.py&amp;quot;, line 1128, in run_cgi&lt;br /&gt;
     os.execve(scriptfile, args, env)&lt;br /&gt;
 OSError: [Errno 8] Exec format error: &amp;#039;/home/pp/Desktop/cgi-bin/nopy&amp;#039;&lt;br /&gt;
 127.0.0.1 - - [01/Oct/2012 20:57:18] CGI script exit status 0x7f00&lt;br /&gt;
&lt;br /&gt;
== Cliente ==&lt;br /&gt;
El módulo &amp;lt;code&amp;gt;urllib&amp;lt;/code&amp;gt; permite manejar peticiones HTTP.  Este ejemplo lee el contenido de la URL proporcionada como parámetro en la línea de comando:&lt;br /&gt;
 import sys&lt;br /&gt;
 import urllib.request&lt;br /&gt;
 &lt;br /&gt;
 f = urllib.request.urlopen( sys.argv[1] )&lt;br /&gt;
 data = f.read()&lt;br /&gt;
 print( data.decode(&amp;#039;utf-8&amp;#039;) )&lt;br /&gt;
Los datos que se reciben son bytes, por eso es necesario decodificar para obtener una cadena.  Un ejemplo del uso:&lt;br /&gt;
 $ python3 get_url.py http://python.org/&lt;br /&gt;
Hay más ejemplos del uso de &amp;lt;code&amp;gt;urllib&amp;lt;/code&amp;gt; en uno de los HowTos mencionados al final.&lt;br /&gt;
&lt;br /&gt;
== Aplicación ==&lt;br /&gt;
Una aplicación puede estar formada por varios scripts CGI en Python.  Se pueden localizar en diferentes carpetas, como &amp;#039;&amp;#039;blog/&amp;#039;&amp;#039;, &amp;#039;&amp;#039;wiki/&amp;#039;&amp;#039;, &amp;#039;&amp;#039;contacto/&amp;#039;&amp;#039;, etc.  En caso de usar algo como server_cgi.py basado en el módulo http.server, se podrían agregar esas carpetas a &amp;lt;code&amp;gt;http.server.cgi_directories&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
En el siguiente ejemplo extendemos la funcionalidad del servidor básico CGI para que ejecute automáticamente &amp;#039;&amp;#039;index.py&amp;#039;&amp;#039; si se encuentra en alguna de las carpetas designadas para CGI, y agregamos un par de rutas para que sean CGI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import BaseHTTPServer, SimpleHTTPServer, CGIHTTPServer&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
def send_head(self):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Version of send_head that finds index.py in CGI directories.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    path = self.path&lt;br /&gt;
    # separate the query&lt;br /&gt;
    i = path.find( &amp;#039;?&amp;#039; )&lt;br /&gt;
    if i &amp;gt;= 0:&lt;br /&gt;
        query = path[ i: ]&lt;br /&gt;
        path = path[ : i ]&lt;br /&gt;
    else:&lt;br /&gt;
        query = &amp;#039;&amp;#039;&lt;br /&gt;
    if os.path.isdir( &amp;#039;.&amp;#039; + path ):  # os.getcwd() ?&lt;br /&gt;
        # check if index.py exists&lt;br /&gt;
        pathindexpy = os.path.join( path, &amp;#039;index.py&amp;#039; )&lt;br /&gt;
        if os.path.exists( &amp;#039;.&amp;#039; + pathindexpy ):&lt;br /&gt;
            path = pathindexpy + query&lt;br /&gt;
            self.path = path&lt;br /&gt;
    if self.is_cgi():&lt;br /&gt;
        return self.run_cgi()&lt;br /&gt;
    else:&lt;br /&gt;
        return SimpleHTTPServer.SimpleHTTPRequestHandler.send_head(self)&lt;br /&gt;
&lt;br /&gt;
PORT = 1234&lt;br /&gt;
server_address = (&amp;#039;localhost&amp;#039;, PORT)&lt;br /&gt;
&lt;br /&gt;
Handler = CGIHTTPServer.CGIHTTPRequestHandler&lt;br /&gt;
&lt;br /&gt;
# overwrite the existing send_head() method&lt;br /&gt;
Handler.send_head = send_head&lt;br /&gt;
&lt;br /&gt;
# add paths to the cgi directories&lt;br /&gt;
Handler.cgi_directories.append( &amp;#039;/contacto&amp;#039; )&lt;br /&gt;
Handler.cgi_directories.append( &amp;#039;/wiki&amp;#039; )&lt;br /&gt;
Handler.cgi_directories.append( &amp;#039;/blog&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
httpd = BaseHTTPServer.HTTPServer( ( server_address, Handler )&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;servidor con CGI en puerto&amp;quot;, PORT)&lt;br /&gt;
httpd.serve_forever()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otra opción es que la aplicación sea un solo script CGI e implementar un mecanismo para definir &amp;#039;&amp;#039;rutas&amp;#039;&amp;#039; y asociar una función o controlador a cada ruta.  Ese mecanismo deberá separar la primera parte de la URL para identificarla como una ruta y entonces invocar la función o controlador que atenderá esa petición.  Igualmente se puede implementar un mecanismo de plantillas para estandarizar o facilitar el diseño de las páginas que se generarán.&lt;br /&gt;
&lt;br /&gt;
= Frameworks =&lt;br /&gt;
Una opción muy popular es utilizar un framework que ofrezca las características que se requieran.  Existen &amp;#039;&amp;#039;full-stack frameworks&amp;#039;&amp;#039; y &amp;#039;&amp;#039;basic frameworks&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Enlaces externos =&lt;br /&gt;
*[http://docs.python.org/py3k/howto/webservers.html#ingredients-for-websites How to Use Python in the web]&lt;br /&gt;
*[http://docs.python.org/py3k/howto/urllib2.html How to Fetch Internet Resources Using The urllib Package]&lt;br /&gt;
*[http://wiki.python.org/moin/WebFrameworks Web Frameworks for Python]&lt;br /&gt;
&lt;br /&gt;
[[Category:HowTos]]&lt;br /&gt;
[[Category:Python]]&lt;br /&gt;
[[Category:PythonCabal]]&lt;/div&gt;</summary>
		<author><name>Patricio Páez</name></author>
		
	</entry>
</feed>