¿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:
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 '''
'''
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:
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 = '''
'''
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