GAE - DJANGO Presentación
Neodoo Microsystems S.L. 2 Cloud Computing ● La computación en la nube (Cloud computing) es un paradigma que permite ofrecer servicios de computación a través de Internet. Autor: Oliver Widder Licencia Creative Commons
Cloud Computing (I) ● Capas de la nube: ● IaaS (infrastructure as a service): – Infraestructura de computación y almacenamiento. – Orientado al desarrollador. ● PaaS (Platform as a service): – Entorno de desarrollo y ejecución de la aplicación. – Orientado al desarrollador. ● SaaS (Software as a service): – Aplicaciones en entorno web. – Orientado al cliente final.
Neodoo Microsystems S.L. 4 Algunos proveedores PaaS
GAE: ¿Por qué? ● Comienzo fácil ● Escalabilidad automática ● Fiabilidad, rendimiento y seguridad de la infraestructura de Google ● Alojamiento gratuito hasta cierto nivel
GAE: Comienzo fácil App Engine es una completa pila de desarrollo que emplea tecnologías habituales para crear y alojar aplicaciones web. En App Engine, puedes crear el código de tu aplicación, probar la aplicación en tu equipo local y subirla a Google únicamente haciendo clic en un botón o introduciendo una secuencia en la línea de comandos.
GAE: Fácil creación y despliegue
GAE: Muchas librerías
GAE: Escalabilidad automática Por primera vez, tus aplicaciones pueden aprovechar las mismas tecnologías escalables sobre las que están creadas las aplicaciones de Google como, por ejemplo, BigTable y GFS. App Engine dispone de una función de escalabilidad automática, así que lo único que tienes que hacer es crear el código de tu aplicación y nosotros nos encargamos del resto. App Engine puede satisfacer tus necesidades independientemente del número de usuarios de que dispongas y de la cantidad de datos que almacene tu aplicación.
GAE: Fiabilidad, rendimiento,... La infraestructura de Google es famosa por su gran fiabilidad y por su alto rendimiento. Con App Engine, puedes aprovechar los diez años de experiencia que posee Google en la ejecución de sistemas escalables de forma masiva y concebidos para el rendimiento. A todas las aplicaciones de App Engine les aplican las mismas políticas de seguridad, privacidad y protección de datos que a las demás aplicaciones de Google.
GAE: Alojamiento gratuito Crear una aplicación en App Engine no sólo resulta fácil. ¡Además es gratis! Puedes crear una cuenta y publicar una aplicación que la gente podrá utilizar inmediatamente sin ningún coste ni obligación. Una aplicación de una cuenta gratuita dispone de hasta 500 MB de espacio y admite hasta cinco millones de vistas mensuales. Cuando estés listo para más, puedes habilitar la facturación, configurar un presupuesto diario máximo y asignarle el presupuesto a cada recurso en función de tus necesidades.
GAE: Limites y cuotas (I)
GAE: Limites y cuotas (II)
GAE: Limites y cuotas (III)
GAE: Limites y cuotas (IV)
GAE-Python ● Permite provechar la gran cantidad de bibliotecas, de herramientas y de frameworks para Python que utilizan los desarrolladores profesionales para crear aplicaciones web internacionales. ● Las aplicaciones web Python interactúan con el servidor web App Engine mediante el uso del protocolo CGI. Las aplicaciones pueden utilizar un framework de aplicaciones web compatible con WSGI mediante un adaptador de CGI. ● Para facilitar el comienzo, App Engine incluye un framework de aplicaciones web sencillas denominado webapp. ● Para aplicaciones de mayor tamaño, los frameworks avanzados de terceros como Django, por ejemplo, también funcionan con App Engine.
GAE-Python: Entorno ejecución ● App Engine es compatible con Python 2.5. ● Python se ejecuta en un entorno seguro de "zona de pruebas". ● Puede ejecutar cualquier código Python, incluidos los módulos Python que contenga tu aplicación, así como la biblioteca Python estándar. ● El intérprete no puede cargar los módulos Python con el código C, puesto que se trata de un entorno Python "puro". ● La zona de pruebas asegura que la aplicación sólo pueda realizar acciones que no interfieran con el rendimiento ni con la escalabilidad de otras aplicaciones. ● El intérprete de Python genera una excepción cuando una aplicación intenta importar un módulo de la biblioteca estándar conocida para trabajar fuera de las restricciones de la zona de pruebas.
GAE-Python: Python puro ● El entorno incluye la biblioteca estándar de Python. ● Algunos módulos se han desactivado porque sus funciones principales no son compatibles con App Engine como : ● La interconexión o la escritura en el sistema de archivos. ● El módulo os está disponible, pero algunas funciones no compatibles se encuentran inhabilitadas. ● Si se intenta importar un módulo no compatible o utilizar una función no compatible, se generará una excepción.
GAE-Python: Módulos Algunos módulos de la biblioteca estándar se han sustituido o se han personalizado para que funcionen con App Engine. Por ejemplo: ● cPickle se ha aliado con pickle. Las funciones específicas de cPickle no son compatibles. ● marshal está vacío. La importación se realizará correctamente, pero no si se utiliza este módulo. ● Estos módulos están igualmente vacíos: imp, ftplib, select, socket ● tempfile se encuentra inhabilitado, salvo en el caso de TemporaryFile, que se ha aliado con StringIO. ● logging está disponible y se recomienda su uso. Consulta la información que aparece a continuación.
GAE-Python: No se puede ● Escribir en el sistema de archivos. La lectura desde el sistema de archivos está permitida y todos los archivos de aplicación subidos con la aplicación están disponibles. ● Abrir un socket ni acceder a otro host directamente. Una aplicación puede utilizar el servicio de extracción de URL de App Engine para realizar solicitudes HTTP y HTTPS a otros hosts en los puertos 80 y 443, respectivamente. ● Generar un subproceso. El procesamiento de una solicitud web a una aplicación debe ser un único proceso que dure unos cuantos segundos. Los procesos que tardan mucho tiempo en responder se finalizan para evitar la sobrecarga del servidor web. ● Realizar otro tipo de llamadas al sistema.
GAE-Python: Tiempo de solicitud ● Se dispone de una cantidad de tiempo limitada para generar y devolver una respuesta a una solicitud, en general, 30 segundos aproximadamente. Una vez alcanzado el plazo, el controlador de solicitudes se interrumpe. ● El entorno de tiempo de ejecución Python interrumpe el controlador de solicitudes mediante la generación de la excepción DeadlineExceededError del paquete google.appengine.runtime. Si el controlador de solicitud no detecta esta ni otras excepciones, el entorno de tiempo de ejecución devuelve al cliente un error de servidor HTTP 500. ● El controlador de solicitud puede detectar este error para personalizar la respuesta.
GAE-Python: Servicios ofrecidos ● Almacén de datos. Incluye herramientas de modelado de datos muy completas para gestionar los esquemas de datos. El API admite dos interfaces para realizar consultas al almacén de datos, incluido GQL, un lenguaje de consultas similar a SQL que también se utiliza en la consola de administración. ● Memcache. Proporciona un almacenamiento en caché distribuido compatible con el API Memcache Python. ● Extracción de URL. Para acceder a recursos en la web usando los protocolos HTTP y HTTPS. Se pueden utilizar los módulos urllib, urllib2 o httplib de la biblioteca estándar Python o bien el API de servicio de extracción de URL de App Engine. ● Envio de s, tratamiento de imagenes, usar cuentas de google, tareas programadas,...
GAE-Python: Solicitudes y CGI ● Cuando App Engine recibe una solicitud web para tu aplicación, App Engine ejecuta la secuencia de comandos de controlador que se corresponde con la URL, como se describe en el archivo de configuración app.yaml de la aplicación. ● App Engine utiliza el estándar CGI para comunicar los datos de solicitud al controlador y recibir la respuesta. ● App Engine utiliza varios servidores web para ejecutar tu aplicación y ajustará automáticamente el número de servidores en uso para procesar las solicitudes de una forma segura. ● Una determinada solicitud se puede enviar a cualquier servidor, que no tiene que ser el mismo servidor que procesó una solicitud anterior procedente del mismo usuario.
GAE-Python: Ejemplo app.yaml application: myapp version: 1 runtime: python api_version: 1 handlers: - url: / script: home.py - url: /index\.html script: home.py - url: /stylesheets static_dir: stylesheets - url: /(.*\.(gif|png|jpg)) static_files: static/\1 upload: static/(.*\.(gif|png|jpg)) - url: /admin/.* script: admin.py login: admin - url: /.* script: not_found.py
GAE-Python: Herramientas Incluye herramientas para probar tu aplicación, subir los archivos de tu aplicación, gestionar los índices del almacén de datos, descargar los datos del registro y subir grandes cantidades de datos al almacén de datos: ● Servidor de desarrollo: Simula el almacén de datos, los servicios y las restricciones. ● appcfg.py: Herramienta multiuso para subir aplicación, actualización de indice de datos, descargar logs,... ● Subida de datos: Puede añadir datos al almacén de datos de tu aplicación desde tus archivos de datos locales. Esta herramienta puede extraer los datos de los archivos CSV, un formato de hoja de cálculo compatible con la mayoría de software de hojas de cálculo como, por ejemplo, Google Docs o Microsoft Excel.
GAE-Python: Bibliotecas externas ● Django ● WebOb 0.9 ● PyYAML 3.05 ● Puedes incluir otras bibliotecas Python puras en tu aplicación.
GAE-Python: WEBAPP ● Google App Engine admite cualquier framework creado en su totalidad con Python que utilice el estándar CGI. ● Y cualquier framework compatible con WSGI que utilice un adaptador de CGI. ● Incluidos Django, CherryPy, Pylons y web.py. ● App Engine incluye un sencillo framework para aplicaciones web denominado webapp. ● El framework webapp está instalado en el entorno de App Engine y en el kit de desarrollo de software (SDK), por lo que no tendrás que asociarlo al código de tu aplicación para utilizarlo.
GAE-Webapp: Partes ● Una o varias clases RequestHandler que procesan solicitudes y generan respuestas, ● Una instancia de WSGIApplication que dirige las solicitudes entrantes a los controladores en función de su URL. ● Una rutina principal que ejecuta WSGIApplication con un adaptador de CGI.
GAE-Webapp: Hola Mundo from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app class MainPage(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello, webapp World!') application = webapp.WSGIApplication( [('/', MainPage)], debug=True) def main(): run_wsgi_app(application) if __name__ == "__main__": main()
GAE-Webapp: Funciones ● El módulo webapp está incluido en el paquete google.appengine.ext. Este módulo se facilita con el SDK y también se encuentra en el entorno de tiempo de ejecución de producción. ● Cuando webapp recibe una solicitud GET HTTP para una URL, crea una instancia de la clase y ejecuta el método get de esa instancia. ● Se puede obtener información sobre la solicitud y respuesta dentro del método con self.request y self.response. ● La propia aplicación se representa mediante una instancia de webapp.WSGIApplication. ● La función run_wsgi_app() utiliza una instancia WSGIApplication (u otro objeto de aplicación compatible con WSGI) y la ejecuta en el entorno CGI de App Engine.
GAE-Webapp: Cuentas google from google.appengine.api import users from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app class MainPage(webapp.RequestHandler): def get(self): user = users.get_current_user() if user: self.response.headers['Content-Type'] = 'text/plain' self.response.out.write('Hello, ' + user.nickname()) else: self.redirect(users.create_login_url(self.request.uri)) application = webapp.WSGIApplication([('/', MainPage)], debug=True) def main(): run_wsgi_app(application) if __name__ == "__main__": main()
GAE-Django: Introducción ● Google App Engine incluye Django ● Si estás utilizando la última versión estable, no tendrás que instalar nada. ● Sólo tendrás que importar tus módulos de Django como harías normalmente. ● También se cubren las modificaciones que se deben incluir si se utiliza la versión de desarrollo de Django.
GAE-Django: Controlador WSGI I ● Para que tu aplicación Django se inicie con el controlador WSGI, sólo tienes que realizar unos sencillos pasos. ● Debes importar util desde google.appengine.ext.webapp y el módulo del controlador desde Django. ● Por otra parte, en lugar de gestionar las excepciones con manage.py, es posible registrar todas las excepciones con Google App Engine y visualizar los registros en la consola de administración.
GAE-Django: Controlador WSGI II import logging, os # Google App Engine imports. from google.appengine.ext.webapp import util # Force Django to reload its settings. from django.conf import settings settings._target = None # Must set this env var before importing any part of Django os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' import logging import django.core.handlers.wsgi import django.core.signals import django.db import django.dispatch.dispatcher
GAE-Django: Controlador WSGI III def log_exception(*args, **kwds): logging.exception('Exception in request:') # Log errors. django.dispatch.dispatcher.connect( log_exception, django.core.signals.got_request_exception) # Unregister the rollback event handler. django.dispatch.dispatcher.disconnect( django.db._rollback_on_exception, django.core.signals.got_request_exception) def main(): # Create a Django application for WSGI. application = django.core.handlers.wsgi.WSGIHandler() # Run the WSGI CGI handler with that application. util.run_wsgi_app(application) if __name__ == '__main__': main()
GAE-Django: Controlador WSGI IV ● app.yaml application: my_application version: 1 runtime: python api_version: 1 handlers: - url: /static static_dir: static - url: /.* script: main.py
GAE-Django: Versión de desarrollo I ● Para utilizar la versión de desarrollo, debes descargar todo el proyecto de Django e incluirlo en el directorio de nivel superior de tu aplicación. ● Para reducir el número de archivos implementados en Google App Engine, puedes eliminar los siguientes directorios de tu carpeta de Django: ● django/bin ● django/contrib/admin ● django/contrib/auth ● django/contrib/databrowse ● django/test ● Se tiene que modificar "main.py" para eliminar la versión estándar de Django y cargar la copia que hayas incluido con tu aplicación.
GAE-Django:Versión de desarrollo II import logging, os, sys # Google App Engine imports. from google.appengine.ext.webapp import util # Remove the standard version of Django. for k in [k for k in sys.modules if k.startswith('django')]: del sys.modules[k] # Force sys.path to have our own directory first, in case we want to import # from it. sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) # Must set this env var *before* importing any part of Django os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
GAE-Django:Versión desarrollo III import django.core.handlers.wsgi import django.core.signals import django.db import django.dispatch.dispatcher def main(): # Create a Django application for WSGI. application = django.core.handlers.wsgi.WSGIHandler() # Run the WSGI CGI handler with that application. util.run_wsgi_app(application) if __name__ == '__main__': main()
GAE-Django: Configuración I ● App Engine no admite los modelos de Django. ● Se tienen que dejar vacías todas las cadenas "DATABASE_*". ● Las aplicaciones y el middleware de administración y autenticación se deberán inhabilitar, ya que requieren el uso de modelos de Django. ● Las funciones que proporcionan se encuentran cubiertas por la consola de administración y el API de usuarios de App Engine, respectivamente. ● Las sesiones también dependen de modelos de Django, por lo que también tienes que inhabilitarlas. ● Por último, deberás sustituir las referencias a "project.ap" con "app" y establecer de forma dinámica la ruta de tu directorio de plantillas.
GAE-Django: Configuración II import os ROOT_URLCONF = 'urls' # Replace 'project.urls' with just 'urls' MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', # 'django.contrib.sessions.middleware.SessionMiddleware', # 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.middleware.doc.XViewMiddleware', ) INSTALLED_APPS = ( # 'django.contrib.auth', 'django.contrib.contenttypes', # 'django.contrib.sessions', 'django.contrib.sites', ) ROOT_PATH = os.path.dirname(__file__) TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or # "C:/www/django/templates". Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ROOT_PATH + '/templates', )
GAE-Django: Entorno desarrollo ● El kit de desarrollo de software (SDK) de Google App Engine incluye el servidor web de desarrollo dev_appserver.py. ● Te permite implementar tu aplicación en el entorno de desarrollo de Google App Engine. ● Además, no tendrás que utilizar manage.py para sincronizar tu base de datos al utilizar el almacén de datos de Google App Engine.
Referencias ● Python en GAE ● ● Django en GAE ● ● Almacenamiento de datos para Django en GAE ●