SlideShare a Scribd company logo
1 of 28
Download to read offline
Pensando en grande




Nivel: Intermedio        Por Martín Mulone
                             @mulonemartin
Principales características del framework


Código libre y desarrollado por una comunidad. LGPL v3.0

Corre en todos lados (escrito en lenguaje Python): Win, Linux, Mac.

No tiene archivos de configuración y ninguna otra dependencia más que el python estándar.

Tiene integrado una capa de abstracción de datos. Escribe el SQL por nosotros en tiempo
real. Soporta Sqlite, Appengine, Postgresql, Mysql, Oracle, DB2, Mssql, Informix, etc.

 La seguridad como primera prioridad

 No requiere instalación. Soporte PyPI

 Siempre compatible con versiones anteriores

 Utiliza el patrón de diseño MVC

 Web forms, Validators, Uploads, Helpers, Autorizaciones, Roles, etc.

 Administración de aplicaciones, errores y tickets en linea. Ayuda de creación de
 aplicaciones: Wizard.
Web2py: Logros obtenidos


3000 Usuarios registrados en los diferentes grupos. Siendo una comunidad
muy activa y participativa.
Más de 50 desarrolladores han colaborado en el proyecto desde 2007.

“Web2py Framework - Bossie Awards 2011.
The best open source application development software.
InfoWorld's Test Center picks the best open source development tools of 2011. By Doug Dineley, Peter Wayner,
Rick Grehan InfoWorld.com

“Web2py score: 8.8 Very Good. Infoworld.com
"Web2py may well be the best framework for Python-savvy developers to enter the world of framework-based
Web application development." Rick Grehan in "Pillars of Python: Six Python Web frameworks compared"
Infoworld.com
Aplicaciones del usuario
Arquitectura de aplicaciones del usuario - Modelos

 Models                          db = DAL('sqlite://storage.sqlite')
                                 db.define_table('clientes',
Controllers                                Field('nombre','string'),
                                           Field('apellido','string'))
  Views
                                 db.define_table('productos',
Translations                               Field('nombre','string'),
                                           Field('categoria','string'))
 Modules

Static Files
                                     Models

                                         db.py
                                         menu.py
Arquitectura de aplicaciones del usuario - Controladores

 Models                        def agregar_cliente():
                                  form = SQLFORM(db.clientes)
Controllers                       if form.process().accepted:
                                        response.flash = 'cliente agregado!'
  Views                           return dict(form=form)

                               def agregar_productos():
Translations                      form = SQLFORM(db.productos)
                                  if form.process().accepted:
 Modules                                response.flash = 'producto agregado!'
                                  return dict(form=form)
Static Files

                                    Controllers

                                         default.py
Arquitectura de aplicaciones del usuario - Vistas
                            agregar_producto.html
 Models                    {{extend 'layout.html'}}
                           {{=form}}
Controllers                 agregar_cliente.html
                           {{extend 'layout.html'}}
  Views
                           {{=form}}
Translations                layout.html
                            <html>
 Modules                    <body>
                            {{include}}
                            </body>
Static Files                </html>

                                 Views
                                          default
                                                agregar_producto.html
                                                agregar_cliente.html
                                  layout.html
Diagrama de funcionamiento de nuestra aplicación
        Agregar Cliente                                                  Agregar Producto

http://localhost:8000/default/agregar_cliente                 http://localhost:8000/default/agregar_producto



          request                                                                       request

                                                 Server


                                                 db.py
                                                 menu.py           Models


         controller                                                                    controller

           agregar_cliente                                                    agregar_producto


                view                            layout.html                         view



              browser                                                              browser
Diagrama de funcionamiento de nuestra applicación + cant. modelos

           Agregar Cliente                                                     Agregar Producto

   http://localhost:8000/default/agregar_cliente                    http://localhost:8000/default/agregar_producto



             request                                                                          request

                                                     Server


                                                   clientes.py
                                                   db.py                          Models
                                                   facturacion.py
                                                   formularios.py
                                                   menu.py
                                                   productos.py
                                                   ventas.py
                                                   settings.py
Problemáticas que acontecen con muchos modelos

A medida que nuestra aplicación incrementa la cantidad de
modelos, decrece el rendimiento.

Polución del espacio de nombres “namespace” a través de los
modelos.

Orden de ejecución de modelos.




                                                      :(
Orden de ejecución de los modelos

Se leen todos los archivos .py de la carpeta “models” de manera secuencial y en orden alfabético.




       Models                                                        Models

         clientes.py                                                   01_settings.py
         db.py                                                         02_db.py
         facturacion.py                                                03_menu.py
         formularios.py                                                04_clientes.py
         menu.py                                                       05_facturacion.py
         productos.py                                                  06_productos.py
         ventas.py                                                     07_formularios.py
         settings.py                                                   08_ventas.py



Se deben renombrar los archivos anteponiendo números, para darle orden a la lógica de
ejecución de nuestros modelos. Ejemplo: No podemos definir nuestros datos si antes no
conectamos a nuestra base de datos.
Uso de modelos condicionales
Carpetas con el nombre del controlador, hace que en el “request” sólo sea tenido en
cuenta los modelos que se encuentren en la carpeta correspondiente al controlador
pedido.


     models                                          models
                                                           clientes
      clientes.py
      db.py                                                      01_db.py
      facturacion.py                                             02_menu.py
      formularios.py                                             03_clientes.py
      menu.py                                              productos
      productos.py
      ventas.py                                                  01_db.py
      settings.py                                                02_menu.py
                                                                 03_productos.py




                                                          Mejor aún
Uso de módulos

 Models        Basta con poner nuestros archivos .py en la carpeta
               modules/ que contengan nuestras librerías con clases,
Controllers    objetos, etc. que queremos usar en nuestras aplicaciones.

               Luego hacemos uso de los mismos haciendo “import” desde
  Views        nuestros controladores o modelos.

Translations

 Modules                                      Modules/
                                                __init__.py
Static Files                                    clientes.py
                                                facturacion.py
                                                productos.py
Uso de módulos



           ANTES                                  AHORA

          modules                                 modules
             __init__.py                             __init__.py
             clientes.py                             clientes.py


modclientes = local_import(“clientes”)   from clientes import Clientes
clientes = modclientes.Clientes()        clientes = Clientes()
Ejemplo 1 - Uso de módulos

         Modules/                               Models/                           Controllers/
           clientes.py                            db.py                             clientes.py


                                    db = DAL('sqlite://storage.sqlite')
from gluon import *
                                                                          from clientes import Clientes
class Clientes(object):
   """ Métodos de cliente """
                                                                          def listar():
   def __init__(self, db):
                                                                             “”” Lista los Clientes “””
      self.db = db
                                                                             clientes = Clientes(db)
                                                                             clientes.define_tables()
  def define_tables(self):
                                                                             lista = clientes.listar()
    db = self.db
    db.define_table('clientes',
                                                                             return dict(lista=lista)
           Field('nombre','string'),
           Field('apellido','string'))

  def listar(self):
     db = self.db
     return db(db.clientes>0).select()
Ejemplo 2 - Uso de módulos

       Modules/                                  Models/                             Controllers/
         miapp.py                                  db.py                               clientes.py
         clientes.py
                                     db = DAL('sqlite://storage.sqlite')
from gluon import *
                                                                           from clientes import Clientes
class MiApp(object):
   def __init__(self, db):                                                 def listar():
      self.db = db                                                            “”” Lista los Clientes “””
                                                                              clientes = Clientes(db)
  def define_tables(self):                                                    app = MiApp(db)
    db = self.db                                                              app.define_tables()
    db.define_table('clientes',                                               lista = clientes.listar()
           Field('nombre','string'),
           Field('apellido','string'))                                        return dict(lista=lista)
     db.define_table('productos',
           Field('nombre','string'),
           Field('categoria','string'))
Usando módulos en nuestro ambiente de desarrollo

Para cada cambio en nuestros módulos habría que reiniciar el web2py, para evitar esta
práctica lo que hacemos es agregar al comienzo de nuestro primer modelo las siguientes
lineas:




            if request.is_local:
                from gluon.custom_import import track_changes
                track_changes()
Módulos: Accediendo a las variables globales: request, response, etc.
 Para acceder a las variables globales request, response, session y otras ayudas de web2py
 basta con hacer en nuestro módulo “from gluon import *” esto nos trae:


               ● El objeto thread local current: response, request, session.
               ● Ayudas: H1, A, SPAN, TAG, etc.

               ● Validadores: IS_IN_DB, IS_IMAGE, etc.

               ● Otros: DAL, SQLFORM, SQLTABLE, etc.




                                               from gluon import *

                                               class MiApp(object):
                                                  def __init__(self, db):
                   Modules/                          self.db = db
                     miapp.py                        response = current.response
                                                     request = current.request
                                                     session = current.session
Cuando es necesario un uso obligatorio de módulos




Desarrollo de plugins, extensiones u otros agregados.
Dichas extensiones no deben mezclarse con la lógica principal de
nuestra aplicación en desarrollo. Se hace uso de las mismas
importándolas en nuestra aplicación.
Desarrollo de “plugins”

      modules                                                        Controllers/
             plugins                                                   clientes.py
                comments.py
from gluon import *

class PluginComments(object):                         from clientes import Clientes
   def __init__(self, db):                            from plugins.comments import PluginComments
      self.db = db
                                                      def cliente():
  def install(self):
                                                         cli = request.vars.id
     db = self.db                                        clientes = Clientes(db)
     db.define_table('comments',
                                                         info = clientes.info(cli)
           Field('record','integer'),
                                                         comenta =
           Field('author_id', db.auth_user),
                                                      PluginComments(db).install().render(cli)
           Field('comment','text'))
    return self
                                                         return dict(info=info, comenta=comenta)
 def render(self, record):
     db = self.db
     return db(db.comments.record==record).select()
Prácticas en el uso de controladores

           EVITAR                                                      HACER
          controllers                                                 controllers
               default.py                                                  clientes.py
                                                                           productos.py

http://localhost:8000/default/agregar_cliente            http://localhost:8000/clientes/agregar
http://localhost:8000/default/agregar_producto           http://localhost:8000/productos/agregar


 def agregar_cliente():                                                           def agregar():
                                                        clientes.py
     return dict()                                                                     return dict()

 def agregar_producto():                                                          def agregar():
     return dict()                                      productos.py
                                                                                       return dict()
Mágia

“The important thing is to have just the right amount of magic.” Michael Foord.


           El desarrollo moderno, es muy competitivo, requiere que
           las soluciones se desarrollen en el menor tiempo posible
           para abaratar costos.


                            El framework nos brinda ciertas herramientas que
                            nos permiten simplificar el desarrollo a una
                            manera muy sencilla, pero no única.



                         Un ejemplo de administración de usuarios:

                           usuarios = SQLFORM.grid(db.auth_user)
Nuevo CRUD: Grid y Smartgrid
Nos permite hacer Altas, Bajas, Modificaciones, Búsquedas, Exportar a CSV. Soporta
Paginación, Ordenar por campo, tablas referenciadas y más.

        models/
          db.py


db.define_table('person',Field('name'))
db.define_table('dog',Field('name'),Field('image','upload'),Field('owner',db.person))
db.dog.owner.requires = IS_IN_DB(db, 'person.id', db.person._format)


        controllers/
           default.py




@auth.requires_login()
def smartgrid():
  grid=SQLFORM.smartgrid(db.person)
  return dict(grid=grid)
Scheduler
Nos permite correr tareas diferidas y/o programadas.
     No tiene requerimientos de librerías, usa el propio DAL para llevar la cola de tareas.

     Ideal para tareas largas en ejecución.
     Tareas programadas: diarias, semanales, mensuales, etc.

      Utiliza la notación JSON, para pasar las variables.
      Sencillo y liviano sólo 400 líneas de código.
      Corre en segundo plano, por lo que no está afectado por los “timeouts” de navegadores.
Scheduler ejemplo
                                                    from gluon.scheduler import Scheduler
       models
        db.py                                       def populate_db():
                                                      from gluon.contrib.populate import populate
        tasks.py
                                                      populate(db.person,200)
                                                      populate(db.dog,200)
                                                      db.commit()

                                                    #list your task here
                                                    available_tasks = dict(populate_db=populate_db)

                                                    scheduler = Scheduler(db, available_tasks)
       modules
        plugins
            scheduler                               from gluon.scheduler import Scheduler
                                                    if __name__ == "__main__":
            scheduler.py                               """ Main execution """

                                                      scheduler.loop()


Correr scheduler como:
python web2py.py --port=8001 -S scheduler -M -R applications/scheduler/modules/plugins/scheduler/scheduler.py

                                                                 Aplicación completa: http://bit.ly/qmHk1m
Conclusiones


Es un framework de evolución constante, actualmente en la versión 1.99, se acerca la
versión 2.0 con muchos cambios en la mira.

Nos permite “prototipar” nuestras aplicaciones de forma rápida y segura, menos
tiempo de programación mayor tiempo para la creación y desarrollo de nuestras
ideas.

Una comunidad muy activa y participativa.

Anímate a probarlo y ayúdanos a hacerlo crecer.
Sobre el autor




Martín Mulone
     @mulonemartin

     http://martin.tecnodoc.com.ar

     https://bitbucket.org/mulonemartin/
Sobre web2py




Sitio oficial: www.web2py.com
Grupo en español: groups.google.com/group/web2py-usuarios

More Related Content

What's hot

Entrenamiento en Acceso a Datos con ASP.NET
Entrenamiento en Acceso a Datos con ASP.NETEntrenamiento en Acceso a Datos con ASP.NET
Entrenamiento en Acceso a Datos con ASP.NETHaaron Gonzalez
 
Drupal 7 a través Drupal Commerce
Drupal 7 a través Drupal CommerceDrupal 7 a través Drupal Commerce
Drupal 7 a través Drupal CommercePedro Cambra
 
Programación web con JSP
Programación web con JSPProgramación web con JSP
Programación web con JSPousli07
 
Trabajar con bases de datos desde ASP.NET
Trabajar con bases de datos desde ASP.NETTrabajar con bases de datos desde ASP.NET
Trabajar con bases de datos desde ASP.NETJavier Roig
 
Clase 14 bundles útiles
Clase 14 bundles útilesClase 14 bundles útiles
Clase 14 bundles útileshydras_cs
 
CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010Comunidad SharePoint
 
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
3. Curso Java JDBC (Bases de datos) - Curso 2005-20063. Curso Java JDBC (Bases de datos) - Curso 2005-2006
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006Samuel Marrero
 
Java y Bases de Datos
Java y Bases de DatosJava y Bases de Datos
Java y Bases de DatosRonny Parra
 
Html5 tecweb
Html5 tecwebHtml5 tecweb
Html5 tecwebcarlos
 
Jsp directiva page
Jsp directiva pageJsp directiva page
Jsp directiva pagejubacalo
 
JBossAS: Desarrollo con especificación EJB 3.0
JBossAS: Desarrollo con especificación EJB 3.0 JBossAS: Desarrollo con especificación EJB 3.0
JBossAS: Desarrollo con especificación EJB 3.0 Aitor Acedo
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en JavaIker Canarias
 
Adapting HTML and CSS Templates to XOOPS
Adapting HTML and CSS Templates to XOOPSAdapting HTML and CSS Templates to XOOPS
Adapting HTML and CSS Templates to XOOPSxoopsproject
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryJavier P.
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryJavier P.
 

What's hot (20)

Entrenamiento en Acceso a Datos con ASP.NET
Entrenamiento en Acceso a Datos con ASP.NETEntrenamiento en Acceso a Datos con ASP.NET
Entrenamiento en Acceso a Datos con ASP.NET
 
Curso Jsp
Curso JspCurso Jsp
Curso Jsp
 
Drupal 7 a través Drupal Commerce
Drupal 7 a través Drupal CommerceDrupal 7 a través Drupal Commerce
Drupal 7 a través Drupal Commerce
 
Apuntes php
Apuntes phpApuntes php
Apuntes php
 
Programación web con JSP
Programación web con JSPProgramación web con JSP
Programación web con JSP
 
Trabajar con bases de datos desde ASP.NET
Trabajar con bases de datos desde ASP.NETTrabajar con bases de datos desde ASP.NET
Trabajar con bases de datos desde ASP.NET
 
Clase 14 bundles útiles
Clase 14 bundles útilesClase 14 bundles útiles
Clase 14 bundles útiles
 
08 i18 n
08 i18 n08 i18 n
08 i18 n
 
CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010
 
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
3. Curso Java JDBC (Bases de datos) - Curso 2005-20063. Curso Java JDBC (Bases de datos) - Curso 2005-2006
3. Curso Java JDBC (Bases de datos) - Curso 2005-2006
 
Java y Bases de Datos
Java y Bases de DatosJava y Bases de Datos
Java y Bases de Datos
 
Html5 tecweb
Html5 tecwebHtml5 tecweb
Html5 tecweb
 
Curso Java Avanzado 5 Ejb
Curso Java Avanzado   5 EjbCurso Java Avanzado   5 Ejb
Curso Java Avanzado 5 Ejb
 
Jsp directiva page
Jsp directiva pageJsp directiva page
Jsp directiva page
 
JBossAS: Desarrollo con especificación EJB 3.0
JBossAS: Desarrollo con especificación EJB 3.0 JBossAS: Desarrollo con especificación EJB 3.0
JBossAS: Desarrollo con especificación EJB 3.0
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en Java
 
Adapting HTML and CSS Templates to XOOPS
Adapting HTML and CSS Templates to XOOPSAdapting HTML and CSS Templates to XOOPS
Adapting HTML and CSS Templates to XOOPS
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
 
Webutil
WebutilWebutil
Webutil
 

Similar to Web2py: Pensando en grande

Kumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y FuturoKumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y FuturoDeivinson Tejeda
 
CLASE03_TEMA02_2.pptx
CLASE03_TEMA02_2.pptxCLASE03_TEMA02_2.pptx
CLASE03_TEMA02_2.pptxDiseoGrfico14
 
Documentacion del proyecto
Documentacion del proyectoDocumentacion del proyecto
Documentacion del proyectoFernando Sorto
 
How To Split The Monolith - From monolith to microservices
How To Split The Monolith - From monolith to microservicesHow To Split The Monolith - From monolith to microservices
How To Split The Monolith - From monolith to microservicesOliver Fierro
 
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...JaenFrankcezco
 
Documentación del proyecto
Documentación del proyectoDocumentación del proyecto
Documentación del proyectoFernando Sorto
 
Programación en N Capas .Net
Programación en N Capas .NetProgramación en N Capas .Net
Programación en N Capas .NetGermán Küber
 
Sistema de ventas, compras y almacén
Sistema de ventas, compras y almacénSistema de ventas, compras y almacén
Sistema de ventas, compras y almacénLeo Ruelas Rojas
 
Modelo incremental
Modelo incrementalModelo incremental
Modelo incrementalRoxny Moreno
 
Ejemplo arquitectura 3 capas con access
Ejemplo arquitectura 3 capas con accessEjemplo arquitectura 3 capas con access
Ejemplo arquitectura 3 capas con accessuniv of pamplona
 
¿Es posible extender a SharePoint 2013? Probablemente en más de una forma…
¿Es posible extender a SharePoint 2013? Probablemente en más de una forma…¿Es posible extender a SharePoint 2013? Probablemente en más de una forma…
¿Es posible extender a SharePoint 2013? Probablemente en más de una forma…Fabian Imaz
 
Aprende a crear y desplegar una aplicación de python que use APIs de BlueVia
Aprende a crear y desplegar una aplicación de python que use APIs de BlueViaAprende a crear y desplegar una aplicación de python que use APIs de BlueVia
Aprende a crear y desplegar una aplicación de python que use APIs de BlueViaBlueVia
 
Exposicion Akelos
Exposicion AkelosExposicion Akelos
Exposicion Akelosdokeosla
 
PROYECTO DE TESIS SISTEMA INTEGRAL DE COMPRA Y VENTA
PROYECTO DE TESIS SISTEMA INTEGRAL DE COMPRA Y VENTAPROYECTO DE TESIS SISTEMA INTEGRAL DE COMPRA Y VENTA
PROYECTO DE TESIS SISTEMA INTEGRAL DE COMPRA Y VENTARoyer Tuesta Salas
 

Similar to Web2py: Pensando en grande (20)

Kumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y FuturoKumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y Futuro
 
CLASE03_TEMA02_2.pptx
CLASE03_TEMA02_2.pptxCLASE03_TEMA02_2.pptx
CLASE03_TEMA02_2.pptx
 
Documentacion del proyecto
Documentacion del proyectoDocumentacion del proyecto
Documentacion del proyecto
 
How To Split The Monolith - From monolith to microservices
How To Split The Monolith - From monolith to microservicesHow To Split The Monolith - From monolith to microservices
How To Split The Monolith - From monolith to microservices
 
Mvc
MvcMvc
Mvc
 
MODELO VISTA CONTROLADOR EN PHP
MODELO VISTA CONTROLADOR EN PHPMODELO VISTA CONTROLADOR EN PHP
MODELO VISTA CONTROLADOR EN PHP
 
Presentación Tecnológica del ERP-I2E
Presentación Tecnológica del ERP-I2EPresentación Tecnológica del ERP-I2E
Presentación Tecnológica del ERP-I2E
 
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
 
Lps y mw
Lps y mwLps y mw
Lps y mw
 
Documentación del proyecto
Documentación del proyectoDocumentación del proyecto
Documentación del proyecto
 
Programación en N Capas .Net
Programación en N Capas .NetProgramación en N Capas .Net
Programación en N Capas .Net
 
Sistema de ventas, compras y almacén
Sistema de ventas, compras y almacénSistema de ventas, compras y almacén
Sistema de ventas, compras y almacén
 
Modelo incremental
Modelo incrementalModelo incremental
Modelo incremental
 
Ejemplo arquitectura 3 capas con access
Ejemplo arquitectura 3 capas con accessEjemplo arquitectura 3 capas con access
Ejemplo arquitectura 3 capas con access
 
¿Es posible extender a SharePoint 2013? Probablemente en más de una forma…
¿Es posible extender a SharePoint 2013? Probablemente en más de una forma…¿Es posible extender a SharePoint 2013? Probablemente en más de una forma…
¿Es posible extender a SharePoint 2013? Probablemente en más de una forma…
 
Aprende a crear y desplegar una aplicación de python que use APIs de BlueVia
Aprende a crear y desplegar una aplicación de python que use APIs de BlueViaAprende a crear y desplegar una aplicación de python que use APIs de BlueVia
Aprende a crear y desplegar una aplicación de python que use APIs de BlueVia
 
Exposicion Akelos
Exposicion AkelosExposicion Akelos
Exposicion Akelos
 
Welcome to Django
Welcome to DjangoWelcome to Django
Welcome to Django
 
Curso Cloud Computing, Parte 2: Google App Engine
Curso Cloud Computing, Parte 2: Google App EngineCurso Cloud Computing, Parte 2: Google App Engine
Curso Cloud Computing, Parte 2: Google App Engine
 
PROYECTO DE TESIS SISTEMA INTEGRAL DE COMPRA Y VENTA
PROYECTO DE TESIS SISTEMA INTEGRAL DE COMPRA Y VENTAPROYECTO DE TESIS SISTEMA INTEGRAL DE COMPRA Y VENTA
PROYECTO DE TESIS SISTEMA INTEGRAL DE COMPRA Y VENTA
 

Recently uploaded

Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfvladimiroflores1
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfAnnimoUno1
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 

Recently uploaded (11)

Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 

Web2py: Pensando en grande

  • 1. Pensando en grande Nivel: Intermedio Por Martín Mulone @mulonemartin
  • 2. Principales características del framework Código libre y desarrollado por una comunidad. LGPL v3.0 Corre en todos lados (escrito en lenguaje Python): Win, Linux, Mac. No tiene archivos de configuración y ninguna otra dependencia más que el python estándar. Tiene integrado una capa de abstracción de datos. Escribe el SQL por nosotros en tiempo real. Soporta Sqlite, Appengine, Postgresql, Mysql, Oracle, DB2, Mssql, Informix, etc. La seguridad como primera prioridad No requiere instalación. Soporte PyPI Siempre compatible con versiones anteriores Utiliza el patrón de diseño MVC Web forms, Validators, Uploads, Helpers, Autorizaciones, Roles, etc. Administración de aplicaciones, errores y tickets en linea. Ayuda de creación de aplicaciones: Wizard.
  • 3. Web2py: Logros obtenidos 3000 Usuarios registrados en los diferentes grupos. Siendo una comunidad muy activa y participativa. Más de 50 desarrolladores han colaborado en el proyecto desde 2007. “Web2py Framework - Bossie Awards 2011. The best open source application development software. InfoWorld's Test Center picks the best open source development tools of 2011. By Doug Dineley, Peter Wayner, Rick Grehan InfoWorld.com “Web2py score: 8.8 Very Good. Infoworld.com "Web2py may well be the best framework for Python-savvy developers to enter the world of framework-based Web application development." Rick Grehan in "Pillars of Python: Six Python Web frameworks compared" Infoworld.com
  • 5. Arquitectura de aplicaciones del usuario - Modelos Models db = DAL('sqlite://storage.sqlite') db.define_table('clientes', Controllers Field('nombre','string'), Field('apellido','string')) Views db.define_table('productos', Translations Field('nombre','string'), Field('categoria','string')) Modules Static Files Models db.py menu.py
  • 6. Arquitectura de aplicaciones del usuario - Controladores Models def agregar_cliente(): form = SQLFORM(db.clientes) Controllers if form.process().accepted: response.flash = 'cliente agregado!' Views return dict(form=form) def agregar_productos(): Translations form = SQLFORM(db.productos) if form.process().accepted: Modules response.flash = 'producto agregado!' return dict(form=form) Static Files Controllers default.py
  • 7. Arquitectura de aplicaciones del usuario - Vistas agregar_producto.html Models {{extend 'layout.html'}} {{=form}} Controllers agregar_cliente.html {{extend 'layout.html'}} Views {{=form}} Translations layout.html <html> Modules <body> {{include}} </body> Static Files </html> Views default agregar_producto.html agregar_cliente.html layout.html
  • 8. Diagrama de funcionamiento de nuestra aplicación Agregar Cliente Agregar Producto http://localhost:8000/default/agregar_cliente http://localhost:8000/default/agregar_producto request request Server db.py menu.py Models controller controller agregar_cliente agregar_producto view layout.html view browser browser
  • 9. Diagrama de funcionamiento de nuestra applicación + cant. modelos Agregar Cliente Agregar Producto http://localhost:8000/default/agregar_cliente http://localhost:8000/default/agregar_producto request request Server clientes.py db.py Models facturacion.py formularios.py menu.py productos.py ventas.py settings.py
  • 10. Problemáticas que acontecen con muchos modelos A medida que nuestra aplicación incrementa la cantidad de modelos, decrece el rendimiento. Polución del espacio de nombres “namespace” a través de los modelos. Orden de ejecución de modelos. :(
  • 11. Orden de ejecución de los modelos Se leen todos los archivos .py de la carpeta “models” de manera secuencial y en orden alfabético. Models Models clientes.py 01_settings.py db.py 02_db.py facturacion.py 03_menu.py formularios.py 04_clientes.py menu.py 05_facturacion.py productos.py 06_productos.py ventas.py 07_formularios.py settings.py 08_ventas.py Se deben renombrar los archivos anteponiendo números, para darle orden a la lógica de ejecución de nuestros modelos. Ejemplo: No podemos definir nuestros datos si antes no conectamos a nuestra base de datos.
  • 12. Uso de modelos condicionales Carpetas con el nombre del controlador, hace que en el “request” sólo sea tenido en cuenta los modelos que se encuentren en la carpeta correspondiente al controlador pedido. models models clientes clientes.py db.py 01_db.py facturacion.py 02_menu.py formularios.py 03_clientes.py menu.py productos productos.py ventas.py 01_db.py settings.py 02_menu.py 03_productos.py Mejor aún
  • 13. Uso de módulos Models Basta con poner nuestros archivos .py en la carpeta modules/ que contengan nuestras librerías con clases, Controllers objetos, etc. que queremos usar en nuestras aplicaciones. Luego hacemos uso de los mismos haciendo “import” desde Views nuestros controladores o modelos. Translations Modules Modules/ __init__.py Static Files clientes.py facturacion.py productos.py
  • 14. Uso de módulos ANTES AHORA modules modules __init__.py __init__.py clientes.py clientes.py modclientes = local_import(“clientes”) from clientes import Clientes clientes = modclientes.Clientes() clientes = Clientes()
  • 15. Ejemplo 1 - Uso de módulos Modules/ Models/ Controllers/ clientes.py db.py clientes.py db = DAL('sqlite://storage.sqlite') from gluon import * from clientes import Clientes class Clientes(object): """ Métodos de cliente """ def listar(): def __init__(self, db): “”” Lista los Clientes “”” self.db = db clientes = Clientes(db) clientes.define_tables() def define_tables(self): lista = clientes.listar() db = self.db db.define_table('clientes', return dict(lista=lista) Field('nombre','string'), Field('apellido','string')) def listar(self): db = self.db return db(db.clientes>0).select()
  • 16. Ejemplo 2 - Uso de módulos Modules/ Models/ Controllers/ miapp.py db.py clientes.py clientes.py db = DAL('sqlite://storage.sqlite') from gluon import * from clientes import Clientes class MiApp(object): def __init__(self, db): def listar(): self.db = db “”” Lista los Clientes “”” clientes = Clientes(db) def define_tables(self): app = MiApp(db) db = self.db app.define_tables() db.define_table('clientes', lista = clientes.listar() Field('nombre','string'), Field('apellido','string')) return dict(lista=lista) db.define_table('productos', Field('nombre','string'), Field('categoria','string'))
  • 17. Usando módulos en nuestro ambiente de desarrollo Para cada cambio en nuestros módulos habría que reiniciar el web2py, para evitar esta práctica lo que hacemos es agregar al comienzo de nuestro primer modelo las siguientes lineas: if request.is_local: from gluon.custom_import import track_changes track_changes()
  • 18. Módulos: Accediendo a las variables globales: request, response, etc. Para acceder a las variables globales request, response, session y otras ayudas de web2py basta con hacer en nuestro módulo “from gluon import *” esto nos trae: ● El objeto thread local current: response, request, session. ● Ayudas: H1, A, SPAN, TAG, etc. ● Validadores: IS_IN_DB, IS_IMAGE, etc. ● Otros: DAL, SQLFORM, SQLTABLE, etc. from gluon import * class MiApp(object): def __init__(self, db): Modules/ self.db = db miapp.py response = current.response request = current.request session = current.session
  • 19. Cuando es necesario un uso obligatorio de módulos Desarrollo de plugins, extensiones u otros agregados. Dichas extensiones no deben mezclarse con la lógica principal de nuestra aplicación en desarrollo. Se hace uso de las mismas importándolas en nuestra aplicación.
  • 20. Desarrollo de “plugins” modules Controllers/ plugins clientes.py comments.py from gluon import * class PluginComments(object): from clientes import Clientes def __init__(self, db): from plugins.comments import PluginComments self.db = db def cliente(): def install(self): cli = request.vars.id db = self.db clientes = Clientes(db) db.define_table('comments', info = clientes.info(cli) Field('record','integer'), comenta = Field('author_id', db.auth_user), PluginComments(db).install().render(cli) Field('comment','text')) return self return dict(info=info, comenta=comenta) def render(self, record): db = self.db return db(db.comments.record==record).select()
  • 21. Prácticas en el uso de controladores EVITAR HACER controllers controllers default.py clientes.py productos.py http://localhost:8000/default/agregar_cliente http://localhost:8000/clientes/agregar http://localhost:8000/default/agregar_producto http://localhost:8000/productos/agregar def agregar_cliente(): def agregar(): clientes.py return dict() return dict() def agregar_producto(): def agregar(): return dict() productos.py return dict()
  • 22. Mágia “The important thing is to have just the right amount of magic.” Michael Foord. El desarrollo moderno, es muy competitivo, requiere que las soluciones se desarrollen en el menor tiempo posible para abaratar costos. El framework nos brinda ciertas herramientas que nos permiten simplificar el desarrollo a una manera muy sencilla, pero no única. Un ejemplo de administración de usuarios: usuarios = SQLFORM.grid(db.auth_user)
  • 23. Nuevo CRUD: Grid y Smartgrid Nos permite hacer Altas, Bajas, Modificaciones, Búsquedas, Exportar a CSV. Soporta Paginación, Ordenar por campo, tablas referenciadas y más. models/ db.py db.define_table('person',Field('name')) db.define_table('dog',Field('name'),Field('image','upload'),Field('owner',db.person)) db.dog.owner.requires = IS_IN_DB(db, 'person.id', db.person._format) controllers/ default.py @auth.requires_login() def smartgrid(): grid=SQLFORM.smartgrid(db.person) return dict(grid=grid)
  • 24. Scheduler Nos permite correr tareas diferidas y/o programadas. No tiene requerimientos de librerías, usa el propio DAL para llevar la cola de tareas. Ideal para tareas largas en ejecución. Tareas programadas: diarias, semanales, mensuales, etc. Utiliza la notación JSON, para pasar las variables. Sencillo y liviano sólo 400 líneas de código. Corre en segundo plano, por lo que no está afectado por los “timeouts” de navegadores.
  • 25. Scheduler ejemplo from gluon.scheduler import Scheduler models db.py def populate_db(): from gluon.contrib.populate import populate tasks.py populate(db.person,200) populate(db.dog,200) db.commit() #list your task here available_tasks = dict(populate_db=populate_db) scheduler = Scheduler(db, available_tasks) modules plugins scheduler from gluon.scheduler import Scheduler if __name__ == "__main__": scheduler.py """ Main execution """ scheduler.loop() Correr scheduler como: python web2py.py --port=8001 -S scheduler -M -R applications/scheduler/modules/plugins/scheduler/scheduler.py Aplicación completa: http://bit.ly/qmHk1m
  • 26. Conclusiones Es un framework de evolución constante, actualmente en la versión 1.99, se acerca la versión 2.0 con muchos cambios en la mira. Nos permite “prototipar” nuestras aplicaciones de forma rápida y segura, menos tiempo de programación mayor tiempo para la creación y desarrollo de nuestras ideas. Una comunidad muy activa y participativa. Anímate a probarlo y ayúdanos a hacerlo crecer.
  • 27. Sobre el autor Martín Mulone @mulonemartin http://martin.tecnodoc.com.ar https://bitbucket.org/mulonemartin/
  • 28. Sobre web2py Sitio oficial: www.web2py.com Grupo en español: groups.google.com/group/web2py-usuarios