Revista Tecnología

Guia Python: subir nuestra aplicación a Internet y recuperar el dato de un text (App Engine).

Publicado el 29 agosto 2013 por Hugo Rep @HugoRep

Python es un lenguaje de script desarrollado por Guido van Rossum.

Podemos codificar empleando programación lineal, estructurada y orientada a objetos (tengamos en cuenta que esta última es la que se ha impuesto en la actualidad).
Se cuenta con intérpretes de Python en múltiples plataformas: Windows, Linux, Mac etc. Se pueden desarrollar aplicaciones de escritorio como aplicaciones web. Empresas como Google, Yahoo, Nasa etc. utilizan este lenguaje para sus desarrollos (actualmente el creador de Python Guido van Rossum trabaja para Google.)

Se puede ejecutar instrucciones de Python desde la línea de comando o creando archivos con extensión *.py. Cuando uno comienza a aprender este lenguaje la línea de comandos nos provee una retroalimentación del resultado en forma inmediata.

El objetivo de este tutorial es presentar en forma progresiva los conceptos fundamentales de este lenguaje y poder analizar los problemas resueltos y codificar los problemas propuestos en este mismo sitio, sin tener que instalar en un principio el Python en su equipo (o luego de instalado poder avanzar con el tutorial en cualquier máquina conectada a internet).

python logo

Subir nuestra aplicación Hola mundo a internet.

Si ya tenemos nuestra aplicación ejecutándose en forma correcta localmente:

http://localhost:8080

Ahora para que la puedan acceder todos en internet debemos seguir los siguientes pasos:

  • El primer paso es registrarnos en Google si todavía no lo hemos hecho para obtener una cuenta y esto lo podemos hacer desde aquí

  • Si ya dispone la cuenta suministrada por Google desde el panel de administración podemos crear una aplicación presionando el botón "Create an Application".

    Debemos seleccionar un nombre para nuestra aplicación que correrá como un subdominio de appspot.com.

    Seleccionado un nombre disponible (podemos comprobar disponibilidad presionando el botón "Check Availability") asignamos un título y aceptamos los términos del servicio. Ya estamos en condiciones de subir nuestra aplicación

  • Controlar que nuestro archivo app.yaml tiene una estructura similar a:

application: tutorialya
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
  script: tutorialya.py

Del ejemplo anterior deberá modificar la propiedad de application con el nombre de aplicación que gestionó desde su panel de control del Google App Engine. Lo mismo pasa con la propiedad script.

Desde la línea de comandos del sistema operativo ejecutar el siguiente programa en Python que tiene por objetivo hacer el upload de todo nuestro proyecto a la cuenta que tenemos asignada en Google App Engine:

c:\Archivo de programa\Google\google_appengine>appcfg.py update tutorialya/

En ese momento se nos solicitará nuestro mail y clave.

  • Ya tenemos en el servidor almacenado nuestro sitio, solo nos falta llamarlo para verlo correr en la web.

http://tutorialya.appspot.com/

Recordar de remplazar el nombre tutorialya con el nombre con el que crearon su aplicación desde el panel del Google App Engine.

Recuperar el dato de un text (App Engine).

Realizaremos una aplicación que muestre un formulario con un control de tipo text y cuando se presione el botón submit mostraremos el dato ingresado en otra página.

import cgi
import wsgiref.handlers

from google.appengine.ext import webapp

class Formulario1(webapp.RequestHandler):
  def get(self):
   self.response.out.write("""
<html>
<head></head>
<body>
<form method="post" action="procformulario1">
Ingrese su nombre:<input type="text" name="nombre" size="20"><br>
<input type="submit" value="Ok">
</form>
</body>
""")

class ProcFormulario1(webapp.RequestHandler):
  def post(self):
   self.response.out.write("<html><head></head><body>")
   self.response.out.write(cgi.escape(self.request.get('nombre')))  
   self.response.out.write("</body></body>")
  

  
def main():
  application = webapp.WSGIApplication([('/', Formulario1),
   ('/procformulario1', ProcFormulario1)],
   debug=True)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
  main()

El programa se inicia al ser verdadera la condición:

if __name__ == '__main__':
  main()

Los módulos son objetos y todos los módulos tienen un atributo llamado __name__. El valor del __name__ de un módulo depende de cómo esté usándolo. Si se importa el módulo, luego la propiedad __name__ es el nombre del fichero del módulo, sin el directorio de la ruta ni la extensión del archivo. Pero también puede ejecutar el módulo directamente como si fuera un programa, en cuyo caso __name__ tendrá un valor especial predefinido __main__.

El if se verifica como verdadero y llama a la función main().

En la función main debemos crear un objeto de la clase WSGIApplication y pasar como parámetro una lista con elementos de tipo tupla que asocian una URL y la clase que procesa dicha petición.

Cuando hacemos referencia a la raiz de nuestro sitio:

http://localhost:8080/

El servidor ejecuta Formulario1 según la tupla indicada con: ('/', Formulario1)

De forma similar cuando se presiona el botón submit del formulario se llama:

http://localhost:8080/procformulario1

y mediante la asociación ('/procformulario1', ProcFormulario1) se ejecutará el código de la clase ProcFormulario.

Todas las páginas de nuestro sitio deben ser mapeadas en la lista:

application = webapp.WSGIApplication([('/', Formulario1),
   ('/procformulario1', ProcFormulario1)],
   debug=True)

El segundo parámetro del constructor de la clase WSGIApplication es el modo de ejecución, normalmente el parámetro debug lo inicializamos en true mientras estamos depurando nuestra aplicación, cuando la finalizamos y la subimos al servidor el parámetro debug le asignamos False.

La clase WSGIApplication se encuentra en el módulo webapp que se encuentra en el paquete google.appengine.ext:

from google.appengine.ext import webapp

La clase Formulario1 hereda de la clase RequestHandler que se encuentra en el paquete webapp. Para generar la página solo debemos reescribir el método get que será el que genere la página web. Para generar el contenido de la página llamamos al método write. La clase RequestHandler contiene un atributo llamado response y este un atributo out que es el que contiene el método write, es decir cada vez que queremos imprimir en la página debemos disponer el siguiente código:

self.response.out.write("Hola Mundo")

Si se trata de generar un bloque grande de HTML podemos utilizar la característica de Python de definir un String de varias líneas encerrándolas entre triple comillas:

self.response.out.write("""
<html>
<head></head>
<body>
<form method="post" action="procformulario1">
Ingrese su nombre:<input type="text" name="nombre" size="20"><br>
<input type="submit" value="Ok">
</form>
</body>
""")

Como vemos no es necesario escapar con el caracter '\' las comillas dobles cuando usamos triple comillas.

Podemos llamar tantas veces al método write como se necesite, todos los string se almacenan en un archivo de memoria que es el que se enviará al navegador que hizo la petición.

Una vez que la página que contiene el formulario se muestra en el navegador el operador ingresa el nombre y al presionar el botón submit el navegador procede a enviar el dato ingresado al servidor.

En la propiedad action del formulario hemos indicado quien procesará el dato en el servidor:

action="\procformulario1\"

Recordemos que tenemos mapeada dicha url :

application = webapp.WSGIApplication([('/', Formulario1),
   ('/procformulario1', ProcFormulario1)],
   debug=True)

Es decir que la clase ProcFormulario1 recibe el dato. Esta clase también hereda de RequestHandler pero debe redefinir el método post. Luego procedemos de forma similar a la otra clase para crear una página en forma dinámica llamando al método write, con la salvedad que para recuperar el dato cargado en el formulario procedemos a llamar al método get del objeto request que contiene la clase:

class ProcFormulario1(webapp.RequestHandler):
  def post(self):
   self.response.out.write("<html><head></head><body>")
   self.response.out.write(cgi.escape(self.request.get('nombre')))  
   self.response.out.write("</body></body>")

Si te ha gustado el artículo inscribete al feed clicando en la imagen más abajo para tenerte siempre actualizado sobre los nuevos contenidos del blog:

Guia Python: subir nuestra aplicación a Internet y recuperar el dato de un text (App Engine).


Volver a la Portada de Logo Paperblog