[Python-es] Como probar python en un servidor web

Alberto Valverde alberto en toscat.net
Jue Abr 12 17:26:10 CEST 2007


On Apr 12, 2007, at 1:38 PM, Javier Pérez Pacheco wrote:

> Hola a todos:
>
> Tengo contratado un hosting y en el se supone que tengo posibilidad de
> programar en Python. La cosa es que no tengo ni idea de por donde  
> empezar.
> He programado muchas cosas con python, conozco el lenguaje, pero es  
> que no
> se como tengo que nombrar los archivos, donde ponerlos, etc.
>
> He creado un archivo "prueba.py" con un "print" de toda la vida  
> pero no se
> ejecuta. No se si tendría que hacer un directorio con algun permiso o
> yoquese.
>
> ¿alguien me puede orientar en este tema? He intentado buscar  
> informacion
> sobre mod_python y ni idea

Si vas a empezar programación web en python ahora yo te recomendaría  
olvidarte de mod_python y empezar por un framework basado en WSGI [1]  
pues es un estándar emergente para conectar aplicaciones web python  
con servidores y casi todo esta gravitando entorno a ello en este  
momento.

Hay varias dónde elegir, hubo un thread en esta lista hace unos meses  
que los comparaba, también han escrito un artículo en un blog  
recientemente con una comparación más extensa [2] (aunque turbogears  
sale peor parado de lo que debería... en fin, cosas del "marketing" ;).

A grandes rasgos: si quieres un framework que te lo dé casi todo  
hecho, interfaz de admnistración de la base de datos incluido,  
empieza por Django (o Zope3 si te sientes valiente). A nivel  
intermedio tienes TurboGears, Pylons y CherryPy. A más bajo nivel  
tienes web.py y las herramientas de Paste para construirte "tu propio  
framework" (es lo que hace Pylons y hará TurboGears2 en mayor o menor  
medida).

De todas las opciones, la que más te ayudará a entender el resto de  
los frameworks, te recomiendo que empieces a jugar con Paste y WSGI  
"a pelo". Es a lo más bajo nivel que puedes programar por encima de  
HTTP, parecido a CGI.... Una sencillisima aplicación, sin usar ningún  
framework o librería sería:

def application(environ, start_response):
     status = '200 OK'
     output = 'Hello World!'

     response_headers = [('Content-type', 'text/plain'),
                         ('Content-Length', str(len(output)))]
     start_response(status, response_headers)

     return [output]

Ésta la tienes que conectar a un servidor web para que la "sirva". En  
puro python, Paste viene con un servidor WSGI basado en  
BaseHTTPServer de la librer´çia estándar que es ideal para  
desarrollar, conectarla sería algo así:

import paste.httpserver
paste.httpserver.serve(application, port=8000, host='0.0.0.0')

Conectarla al servidor WSGI de CherryPy no es más difícil:

import wsgiserver
server = wsgiserver.CherryPyWSGIServer('0.0.0.0', application,  
port=8000)
server.start()

Para servirla en producción lo más típico es usando Apache o nginx  
como proxy inverso a un servidor en python como el de Paste o  
CherryPy (aparte de ser un framework trae un servidor WSGI muy  
respetado). También puedes usar el reciente mod_wsgi que es un módulo  
para Apache para ejecutar Python dentro del propio apache (a lo  
mod_php y mod_perl). La ventaja que tiene sobre mod_python es que es  
mucho más sencillo de configurar y más ligero ya que tan sólo se  
dedica a actuar de puente con tu apliacación sin proveer servicios  
como sesiones, publisher, etc...  (evolución natural ya que  
ultimamente sólo se utiliza mod_python para hacer de puente WSGi con  
un framework que provea dichos servicios). Servir nuestra  
"application" con mod_wsgi sería algo así:

En la config de apache:

<VirtualHost *:80>
ServerName example.com
WSGIScriptAlias / /usr/local/pylons/mysite/apache/miscript.wsgi
</VirtualRoot>

<Directory /usr/local/pylons/mysite/apache>
Order deny,allow
Allow from all
</Directory>

y en miscript.wsgi coloca el trozo de código donde defines  
"application".

La cosa se pone interesante cuando empiezas a construir una "pila"  
para añadir funcionalidad a tu aplicación... WSGI  permite una  
arquitectura desacoplada entre distintos servicios (Pylons lleva esta  
filisofía al extremo). Por ejemplo, si a dicha aplicación le quieres  
añadir autentificación, puedes usar una librería como AuthKit para  
envolverla:

from authkit.authenticate import middleware

application = el_cacho_que_escribimos_antes

def autentifica(environ, username, password):
	"""Autentifica a un usuario. Desde aquí podrías implementar
        ldap, pam, consultar una base de datos...
        Por simplicidad autentificamos a todos los usuarios
        cuyo nombre sea igual a la password
        """
       return username == password

application = middleware(
     application,
     method='basic',
     realm='Test Realm',
     users_valid= autentifica
)

import paste.httpserver
paste.httpserver.serve(application, port=8000, host='0.0.0.0')

Hay middleware muy diverso... desde dispatchers (Routes, Selector)  
para devolver una aplicación WSGI en
función del URL, manejar sesiones (Beaker), servir ficheros estáticos  
(herramientas dentro de Paste), etc...
Échale un ojo a [3] para hacerte una idea.

Así, poco a poco, te puedes construir tu propio framework, o hacerte  
una idea de como los frameworks modernos con los que te puedas  
encontrar implementan internamente sus servicios. Si te parece  
demasiado "denso" es normal ya que lo que he descrito es a muy bajo  
nivel, éste trabajo sucio lo suelen hacer los implentadores de  
frameworks ;) Un framework decente te ofrecerá un API mucho más  
amigable para que te puedas concentrar en tu aplicación.

Bueno, espero que esta parrafada le halla servido de algo a  
alguien... :)

Un saludo,

Alberto


[1] http://www.wsgi.org/wsgi
[2] http://jesusphreak.infogami.com/blog/vrp1
[3] http://www.wsgi.org/wsgi/Middleware_and_Utilities


Más información sobre la lista de distribución Python-es