[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