lunes, 24 de agosto de 2015

Practica No. 3: Programación Google App Engine con Python

¿Qué es Google App Engine?

Google App Engine es un servicio de la familia de Google Cloud Platform que ofrece un servicio del tipo plataforma como servicio (PaaS), es decir permite que realicemos aplicaciones web sin necesidad de preocuparnos por la parte de infraestructura y centrarnos 100% en la aplicación, ya que la infraestructura utilizada es la propia de Google.

Esta plataforma facilita construir, mantener y escalar nuestras aplicaciones fácilmente, además de que soporta varios lenguajes como Java, Python, PHP, etc.  Además no tenemos que preocuparnos de la escalabilidad, la misma plataforma cuenta con un balanceador de cargas, es decir que nuestra aplicación automáticamente será atendida por las maquinas necesarias para que tenga un tiempo de respuesta óptimo.

Ofrece también herramientas seguras de almacenamiento persistente y veloz, especialmente recomendado es utilizar Google Cloud Datastore, la cual es una base de datos NoSQL, una de sus principales características es que es eventualmente consistente, es decir los cambios hechos no son registrados inmediatamente, sino que se realizara eventualmente.

Restricciones de Google App Engine

Todo esto puede sonar muy bien y es válido hacernos la pregunta de cuanto nos costara utilizar una infraestructura de este tipo, y la respuesta es nada, es gratis, mientras nos ajustemos a ciertos límites que se nos imponen, estos son:
  • 1.300.000 solicitudes diarias o 7.400 por minuto. 
  • 10 GB de subida y de bajada de datos diaria o 56 MB por minuto.
  • 1 GB de almacenamiento en el almacén de datos (el datastore).
  • 10.000.000 llamadas al almacén de datos diarias o 57.000 por minuto.
  • 7.000 llamadas al API de correo diarios o 32 llamadas por minuto.
  •  2.000 destinatarios de correo electrónico diarios u 8 por minuto.
Entre otras cosas, la lista completa de cuotas la podremos encontrar aquí, y hay que revisarla cuidadosamente para evitar meternos en problemas posteriormente. Como podemos observar esta plataforma ofrece características muy interesantes que merecen ser vistas a profundidad, y nos permite explorar un nuevo mundo de posibilidades sin ningún costo, la última parte de este post es la integración del GAE con Python.

Como utilizar Python con Google App Engine

Antes que nada hay que aclarar que todavía no tenemos compatibilidad con Python 3 por lo que es necesario utilizar la versión 2.7, en este post estaremos usando el framework de desarrollo oficial de Google, el webapp2. Primero que nada vamos a descargar el SDK de GAE desde la página principal en este link e instalarlo.

Después ejecutaremos el Google App Engine Launcher y en esta aplicación dentro de la pestaña file crearemos una nueva aplicación a la que nombraremos ejemplo, seleccionamos con que lenguaje queremos programar, la ruta donde queremos que se cree el proyecto y los puertos de administración, dentro de esta carpeta se crearan los siguientes archivos main.py el cual tendrá el código que ejecutara nuestra aplicación al recibir una petición, para nuestro caso lo llamaremos ejemplo.py; y por otro lado tenemos un archivo de configuración app.yaml.



La aplicación crea otras cosas también pero para nuestros fines solo nos importa lo anterior, por lo cual eliminaremos lo demás y modificaremos el archivo app.yaml para que se va de la siguiente manera:

application: ejemplo
version: 1
runtime: python27
api_version: 1
threadsafe: false

handlers:
- url: .*
  script: main.py

De este sencillo ejemplo lo único interesante es que en application indicamos el nombre de la carpeta que creamos, en runtime el lenguaje de programación a utilizar y en scripts el archivo que responderá a las peticiones. Una vez que tenemos configurado nuestro archivo de configuración, procedemos a modificar nuestro archivo main.py en este caso es como se muestra a continuación:

# -*- encoding: utf-8 -*-
import sys
import random
print 'Content-Type: text/html'
print ''
print '
'
# Leemos la entrada desde el formulario
data = sys.stdin.read()
try:
    resp = int(data[data.find('=')+1:])
except:
    resp = -1
print 'Tu número es ', resp
answer = random.randint(1, 50)
if resp < answer:
    print 'Tu número es demasiado bajo'
if resp == answer:
    print 'Lo has conseguido los numeros son iguales '
if resp > answer:
    print 'Tu número es demasiado alto'
print '
' print '''
Introduce un número entre 1 y 50:
'''

Como podemos observar este sencillo ejemplo lo único que hace es pedir un numero entre el 1 y el 100 y regresar si acertamos o no, en esta parte hay que destacar que con “print 'Content-Type: text/html'” indicamos que estamos creando una página web y que con la propia instrucción print podemos ir creando nuestra página usando php, además con el método sys.stdin podemos obtener la respuesta del método post. Si queremos correr nuestra aplicación desde el Google App Engine Launcher corremos nuestra aplicación y después vamos a la acción browse que nos abrirá nuestro navegador para probar nuestra aplicación.

En este ejemplo sin embargo no utilizamos el framework webapp2, así que para finalizar mostraremos otra aplicación que ahora si utiliza este framework en su funcionamiento, los elementos básicos son los mismos, sin embargo los archivos deberán modificarse, el archivo app.yaml cambia de la siguiente manera:

application: ejemplo2
version: 1
runtime: python27
api_version: 1
threadsafe: false

handlers:

- url: .*
  script: main.py

libraries:
- name: webapp2
  version: "2.5.2"

Mientras que el archivo main.py es el que se muestra a continuación:

# -*- encoding: utf-8 -*-
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
import random
class MainHandler(webapp.RequestHandler):
    formdata = '''
Introduce un número entre 1 y 100:
''' def get(self): self.response.headers['Content-Type'] = 'text/html' self.response.out.write(self.formdata) def post(self): resp = self.request.get('resp') try: resp = int(resp) except: resp = -1 answer = random.randint(1, 100) if resp < answer: msg = 'Tu número es demasiado bajo' if resp is answer: msg = 'Has acertado campeón, toma un pin!' if resp > answer: msg = 'Tu número es demasiado alto' self.response.out.write('Tu número es : '+str(resp)+' \n') self.response.out.write(msg+'\n') self.response.out.write(self.formdata) def main(): application = webapp.WSGIApplication([('/.*', MainHandler)],debug=True) run_wsgi_app(application) if __name__ is '__main__': main()
Si bien los cambios en el archivo app.yaml no son muchos y queda claro lo que se agregó, vale la pena mencionar que cambios ocurren el manejar el framework webapp2. Los elementos principales son:

·         Una o más clases ResquestHandler para procesar las peticiones y devolver una respuesta
·         Una instancia de WSGIApplication que encaminar la peticiones hacia sus manejadores basándose en su URL
·         Una función main que ejecuta el bucle principal utilizando el adaptador CGI

Dentro del archivo lo primero que vemos es el MainHandler esta clase es la encargada de responder a los solicitudes, a diferencia del ejercicio anterior donde solo escribíamos el componente form, en este lo debemos asiganar a una variable que en este caso denominamos formdata, después se definen dos métodos uno para responder al método post y otro al método get, en este caso el método post se encarga de mandar a pantalla el form que creamos en formato html para que podamos interactuar con el usuario.


Por su lado la función post responde cuando se ingresa el numero en la página y realiza la comparación, y después de desplegar el resultado de igual manera mandar a pantalla de nuevo el form.

Por último la función main crea una WSGIApplication en la cual se le manda a llamar al manejador principal y ejecuta la aplicación en un ciclo propio de wsgi. Si desea puede bajar el primer ejemplo desde aquí y el segundo desde aquíLos ejemplos fueron tomados desde la siguiente fuente

1 comentario:

  1. Dentro del archivo lo primero que vemos es el MainHandler esta clase es la encargada de responder a los solicitudes, a diferencia del ejercicio anterior donde solo escribíamos el componente form, en este lo debemos asiganar a una variable que en este caso denominamos formdata, después se definen dos métodos uno para responder al método post y otro al método get, en este caso el método post se encarga de mandar a pantalla el form que creamos en formato html para que podamos interactuar con el usuario. lectura adicional

    ResponderBorrar