FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Bibliotecas de terceros en hospedaje compartido
Aquí la segunda parte del uso de python en hospedaje compartido, la primera parte está aquí.
Ahora veremos algo con mas posibilidades que simplemente el "Hola Mundo" de la primera parte. Se trata de utilizar bibliotecas de terceros dentro de nuestro proyecto en un hospedaje compartido sin que estas bibliotecas hayan sido instaladas previamente por root, sino que utilizando un directorio local/privado de paquetes python. Esta no es la mejor*1 forma de hacerlo pero opté por ella porque para fines didácticos es la mas fácil y funcional, además de que será el punto de partida para una siguiente fase, un poquito mas avanzada. El objetivo ahora es poder utilizar un framework web de python que sea el punto de partida para realizar una aplicación web cualquiera utilizando bibliotecas de terceros. Una herramienta muy fácil de utilizar es web.py, un framework bastante sencillo como poderoso. De él conozco muy poco, pero lo poco que conozco es suficiente para lo que necesitamos. La aplicación web que propongo no tendrá una funcionalidad muy útil que digamos y mucho menos será nada avanzado, puesto que, lo que nos interesa ahora es utilizar bibliotecas de terceros y empezar a hacer algo dinámico para partiendo de esto lleguemos a hacer algo mas útil donde utilicemos Bases de Datos, usuarios, servicios externos, etc... Entonces, dejando claro esto, me parece conveniente hacer una utilidad que realice operaciones matemáticas según parámetros de url. Como dije arriba, nada complicado ni útil, pero si didáctico. Partiendo de la primera parte de este tutorial, creamos un nuevo archivo .py que será el cgi de esta aplicación, llamémosle mate.py, quedándonos entonces una url como: http://midominio.com/cgi-bin/mate.py Agreguemos a este archivo el mismo código del primer tutorial, con el fin de asegurarnos que nos funciona como el anterior y partamos de allí. Código:
#!/usr/bin/env python # -*- coding: UTF-8 -*- # enable debugging import cgitb cgitb.enable() print "Content-Type: text/plain;charset=utf-8" print print "Hello World!" Prerequisitos Antes que nada debemos saber que prerequisitos tienen los paquetes que vamos a utilizar porque debemos descargarlos manualmente*2 ya que de momento no contamos con un gestor de paquetes. Como vamos a utilizar webpy, este sería el primer paquete, además, webpy tiene como prerequisito otro paquete llamado flup. Los links para las versiones estables en este momento son: Webpy - http://webpy.org/static/web.py-0.37.tar.gz Flup - http://pypi.python.org/pypi/flup/1.0.2 Estos paquetes vienen con la estructura estandar de paquetes python pero como ahora no tenemos un gestor de paquetes debemos fijarnos bien sobre que es lo que vamos a subir al servidor para que funcione como esperamos (pues de lo contrario no funcioanrá nada). En este caso, estos paquetes tienen en su interior un directorio llamado web y flup respectivamente, estos son los directorios que nos interesan. Extraigamos el contenido de estos paquetes y copiemos los directorios web y flup dentro del cgi-bin (se que no es lo mas indicado, pero como dije antes, es solo para fines didácticos) quedándonos ahora una estructura de directorios parecida a esta: Código:
/cgi-bin/ |...web/ |...*** |...application.py |...browser.py |...*** |...flup/ |...client/ |...server/ |...__init__.py |...mate.py Código:
#!/usr/bin/env python # -*- coding: UTF-8 -*- # enable debugging import cgitb; cgitb.enable() # Third party libraries import web urls = ( '/.*', 'index', ) app = web.application(urls, globals()) class index: def GET(self): return 'Hola' app.run() URLs limpias Como esta aplicación actuará dependiendo de la url que el usuario ingrese, no me gusta para nada que la url base sea "/cgi-bin/mate.py", en cambio, prefiero utilizar el prefijo "/mate/" de modo que me permita tener múltiples aplicaciones configuradas en un mismo dominio/ip. Para ello recurrimos al ModRewrite de apache y agregamos al .htaccess algo como esto: Código:
RewriteEngine on RewriteBase / RewriteRule ^mate(.*)$ cgi-bin/mate.py [PT] También debemos configurar las urls de nuestra aplicación para incluir el prefijo puesto que webpy hace un match sobre la url completa. Lo dejamos de la siguiente manera: Código:
urls = ( '/mate/', 'index', ) Ahora es tiempo de agregar las operaciones que realizará nuestra utilidad matemática, primero nos vamos por las urls. Código:
urls = ( '/mate/', 'index', '/mate/suma/(.*)/(.*)', 'suma', '/mate/resta/(.*)/(.*)', 'resta', '/mate/cuadrado/(.*)', 'cuadrado', '/mate/cubo/(.*)', 'cubo' ) Cita:
Código:
class suma: def GET(self, x, y): ix, iy = int(x), int(y) r = ix + iy return r class resta: def GET(self, x, y): ix, iy = int(x), int(y) r = ix - iy return r class cuadrado: def GET(self, x): ix = int(x) r = ix * ix return r class cubo: def GET(self, x): ix = int(x) r = ix * ix * ix return r Cita:
Código:
def response(r): return 'Resultado: [ %s ]' % r Código:
class cubo: def GET(self, x): ix = int(x) r = ix * ix * ix return response(r) Código:
help = ''' Servicio Web de Mate ==================== Usa cualquiera de las siguientes urls: /suma/<X>/<Y> Suma los valores X y Y /resta/<X>/<Y> Resta el valor de Y a X /cuadrado/<X> Devuelve el cuadrado de X /cubo/<X> Devuelve el cubo de X Nota: Los valores de X y Y deben ser enteros ''' Código:
#!/usr/bin/env python # -*- coding: UTF-8 -*- # enable debugging import cgitb; cgitb.enable() # Third party libraries import web help = ''' Servicio Web de Mate ==================== Usa cualquiera de las siguientes urls: /suma/<X>/<Y> Suma los valores X y Y /resta/<X>/<Y> Resta el valor de Y a X /cuadrado/<X> Devuelve el cuadrado de X /cubo/<X> Devuelve el cubo de X Nota: Los valores de X y Y deben ser enteros ''' def response(r): return 'Resultado: [ %s ]' % r urls = ( '/', 'index', '/suma/(.*)/(.*)', 'suma', '/resta/(.*)/(.*)', 'resta', '/cuadrado/(.*)', 'cuadrado', '/cubo/(.*)', 'cubo' ) app = web.application(urls, globals()) class index: def GET(self): return help class suma: def GET(self, x, y): ix, iy = int(x), int(y) r = ix + iy return response(r) class resta: def GET(self, x, y): ix, iy = int(x), int(y) r = ix - iy return response(r) class cuadrado: def GET(self, x): ix = int(x) r = ix * ix return response(r) class cubo: def GET(self, x): ix = int(x) r = ix * ix * ix return response(r) app.run() Notas
|
#2
|
||||
|
||||
Unas notas:
1) Porque no usas las funciones matematicas de python? 2) Una definicion tipo Código PHP:
Código PHP:
3) La expresion regular se puede mejor cambiando a "\d+". "\d" solo capura numeros, "+" se asegura que haya al menos 1 numero que capturar, en cambio "*" dice, captura tenga o algo que capturar. 4) Si encierras con etiqueta [php] masomenos te da un coloreado parecido para python Por lo demas, gracias por el aporte!
__________________
El malabarista. |
#3
|
||||
|
||||
Digamos que quise hacerlo lo mas simple posible para no meter funciones extras y que se entienda a simple vista sin explicar lo que hace cada función. creo que se entiende mas fácil x * x que math.pow(x, 2), además de que debería importar math y explicar sus funciones. Ya en un escenario real porsupuesto que las usaría... perdón, uso .
Cita:
Código PHP:
Cita:
Cita:
A ti gracias por las observaciones . Saludos |
#4
|
||||
|
||||
Muchas gracias D-MO, mañana lo leeré con calma.
// Saludos |
#5
|
||||
|
||||
ufff... un curso acelerado, habrá que ponerse con ello
Gracias.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Python en hospedaje compartido (shared hosting) | D-MO | Python | 6 | 25-07-2012 17:40:24 |
Bibliotecas Dinamicas | Magui | Varios | 1 | 11-04-2005 18:55:33 |
Bibliotecas de Tipos. | jplj | OOP | 0 | 05-10-2004 13:17:07 |
hospedaje CGI | Onti | Internet | 1 | 17-06-2004 03:38:45 |
|