SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler 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

Mais conteúdo relacionado

Mais procurados

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.
 

Mais procurados (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
 

Semelhante a 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
 

Semelhante a 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
 

Último

Inteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidadInteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidaddanik1023m
 
Carta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfCarta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfangelinebocanegra1
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfActividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfalejandrogomezescoto
 
Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.marianarodriguezc797
 
Matriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxMatriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxPaolaCarolinaCarvaja
 
Análisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfAnálisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfcastrodanna185
 
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETDe Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETGermán Küber
 
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...RaymondCode
 
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSPRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSLincangoKevin
 
La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....Aaron Betancourt
 
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfTENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfJoseAlejandroPerezBa
 
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosEl diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosLCristinaForchue
 
Los mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfLos mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfodalistar77
 
VIDEOS DE APOYO.docx E
VIDEOS DE APOYO.docx                                  EVIDEOS DE APOYO.docx                                  E
VIDEOS DE APOYO.docx Emialexsolar
 
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...OLGAMILENAMONTAEZNIO
 
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfPresentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfymiranda2
 
La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2montoyagabriela340
 
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfInmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfOBr.global
 

Último (20)

Inteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidadInteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidad
 
Carta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfCarta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdf
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfActividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
 
Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.
 
Matriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxMatriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docx
 
BEDEC Proyecto y obra , novedades 2024 - Xavier Folch
BEDEC Proyecto y obra , novedades 2024 - Xavier FolchBEDEC Proyecto y obra , novedades 2024 - Xavier Folch
BEDEC Proyecto y obra , novedades 2024 - Xavier Folch
 
Análisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfAnálisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdf
 
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETDe Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
 
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
 
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSPRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
 
La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....
 
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfTENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
 
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosEl diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
 
Los mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfLos mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdf
 
BEDEC Sostenibilidad, novedades 2024 - Laura Silva
BEDEC Sostenibilidad, novedades 2024 - Laura SilvaBEDEC Sostenibilidad, novedades 2024 - Laura Silva
BEDEC Sostenibilidad, novedades 2024 - Laura Silva
 
VIDEOS DE APOYO.docx E
VIDEOS DE APOYO.docx                                  EVIDEOS DE APOYO.docx                                  E
VIDEOS DE APOYO.docx E
 
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
 
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfPresentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
 
La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2
 
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfInmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
 

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