SlideShare una empresa de Scribd logo
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

Más contenido relacionado

La actualidad más candente

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
Haaron 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 Commerce
Pedro Cambra
 
Apuntes php
Apuntes phpApuntes php
Programación web con JSP
Programación web con JSPProgramación web con JSP
Programación web con JSP
ousli07
 
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
Javier Roig
 
Clase 14 bundles útiles
Clase 14 bundles útilesClase 14 bundles útiles
Clase 14 bundles útiles
hydras_cs
 
CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010CSA - Web Parts en SharePoint 2010
CSA - Web Parts en SharePoint 2010
Comunidad 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-2006
Samuel Marrero
 
Java y Bases de Datos
Java y Bases de DatosJava y Bases de Datos
Java y Bases de Datos
Ronny Parra
 
Html5 tecweb
Html5 tecwebHtml5 tecweb
Html5 tecweb
carlos
 
Curso Java Avanzado 5 Ejb
Curso Java Avanzado   5 EjbCurso Java Avanzado   5 Ejb
Curso Java Avanzado 5 Ejb
Emilio Aviles Avila
 
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 Java
Iker 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 XOOPS
xoopsproject
 
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
Javier 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.
 
Webutil
WebutilWebutil
Webutil
SUDAMERICANO
 

La actualidad más candente (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 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 Futuro
Deivinson Tejeda
 
CLASE03_TEMA02_2.pptx
CLASE03_TEMA02_2.pptxCLASE03_TEMA02_2.pptx
CLASE03_TEMA02_2.pptx
DiseoGrfico14
 
Documentacion del proyecto
Documentacion del proyectoDocumentacion del proyecto
Documentacion del proyecto
Fernando 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 microservices
Oliver Fierro
 
MODELO VISTA CONTROLADOR EN PHP
MODELO VISTA CONTROLADOR EN PHPMODELO VISTA CONTROLADOR EN PHP
MODELO VISTA CONTROLADOR EN PHP
Gabriel Atilio Carrillo Seijas
 
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
Ingenieria Informatica Empresarial
 
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
 
Lps y mw
Lps y mwLps y mw
Lps y mw
brianjca
 
Documentación del proyecto
Documentación del proyectoDocumentación del proyecto
Documentación del proyecto
Fernando Sorto
 
Programación en N Capas .Net
Programación en N Capas .NetProgramación en N Capas .Net
Programación en N Capas .Net
Germá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én
Leo 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 BlueVia
BlueVia
 
Exposicion Akelos
Exposicion AkelosExposicion Akelos
Exposicion Akelosdokeosla
 
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
Diego López-de-Ipiña González-de-Artaza
 
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
Royer Tuesta Salas
 

Similar 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

Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
SamuelRamirez83524
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
CrystalRomero18
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
cofferub
 
Conceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. TecnologíaConceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. Tecnología
coloradxmaria
 
TAREA #6 - RECURSOS INCLUSIVOS POR ANGGIE ARRIAGA
TAREA #6 - RECURSOS INCLUSIVOS POR ANGGIE ARRIAGATAREA #6 - RECURSOS INCLUSIVOS POR ANGGIE ARRIAGA
TAREA #6 - RECURSOS INCLUSIVOS POR ANGGIE ARRIAGA
arriagaanggie50
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
ItsSofi
 
Trabajo tecnología sobre Conceptos Básicos De Programación
Trabajo tecnología sobre Conceptos Básicos De ProgramaciónTrabajo tecnología sobre Conceptos Básicos De Programación
Trabajo tecnología sobre Conceptos Básicos De Programación
SofiaCollazos
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
cdraco
 
Desarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdfDesarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdf
samuelvideos
 
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
CesarPazosQuispe
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
Fernando Villares
 
Conceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdfConceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdf
ValeriaAyala48
 
actividad 2 tecnologia (3).pdf junto con mis compañeros
actividad 2 tecnologia (3).pdf junto con mis compañerosactividad 2 tecnologia (3).pdf junto con mis compañeros
actividad 2 tecnologia (3).pdf junto con mis compañeros
aljitagallego
 
Actividad Conceptos básicos de programación.pdf
Actividad Conceptos básicos de programación.pdfActividad Conceptos básicos de programación.pdf
Actividad Conceptos básicos de programación.pdf
NajwaNimri1
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
marianabz2403
 
maestria-motores-combustion-interna-alternativos (1).pdf
maestria-motores-combustion-interna-alternativos (1).pdfmaestria-motores-combustion-interna-alternativos (1).pdf
maestria-motores-combustion-interna-alternativos (1).pdf
JimmyTejadaSalizar
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
JulyMuoz18
 
absorcion de gases y practicas de laboratorios
absorcion de gases y practicas de laboratoriosabsorcion de gases y practicas de laboratorios
absorcion de gases y practicas de laboratorios
JuanAlvarez413513
 
SISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsxSISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsx
tamarita881
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
cristianrb0324
 

Último (20)

Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
 
Conceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. TecnologíaConceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. Tecnología
 
TAREA #6 - RECURSOS INCLUSIVOS POR ANGGIE ARRIAGA
TAREA #6 - RECURSOS INCLUSIVOS POR ANGGIE ARRIAGATAREA #6 - RECURSOS INCLUSIVOS POR ANGGIE ARRIAGA
TAREA #6 - RECURSOS INCLUSIVOS POR ANGGIE ARRIAGA
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
 
Trabajo tecnología sobre Conceptos Básicos De Programación
Trabajo tecnología sobre Conceptos Básicos De ProgramaciónTrabajo tecnología sobre Conceptos Básicos De Programación
Trabajo tecnología sobre Conceptos Básicos De Programación
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
 
Desarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdfDesarrollo de habilidades de pensamiento (2).pdf
Desarrollo de habilidades de pensamiento (2).pdf
 
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
Semana 10_MATRIZ IPER_UPN_ADM_03.06.2024
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
 
Conceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdfConceptos básicos de programación 10-5.pdf
Conceptos básicos de programación 10-5.pdf
 
actividad 2 tecnologia (3).pdf junto con mis compañeros
actividad 2 tecnologia (3).pdf junto con mis compañerosactividad 2 tecnologia (3).pdf junto con mis compañeros
actividad 2 tecnologia (3).pdf junto con mis compañeros
 
Actividad Conceptos básicos de programación.pdf
Actividad Conceptos básicos de programación.pdfActividad Conceptos básicos de programación.pdf
Actividad Conceptos básicos de programación.pdf
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
 
maestria-motores-combustion-interna-alternativos (1).pdf
maestria-motores-combustion-interna-alternativos (1).pdfmaestria-motores-combustion-interna-alternativos (1).pdf
maestria-motores-combustion-interna-alternativos (1).pdf
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
 
absorcion de gases y practicas de laboratorios
absorcion de gases y practicas de laboratoriosabsorcion de gases y practicas de laboratorios
absorcion de gases y practicas de laboratorios
 
SISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsxSISTESIS RETO4 Grupo4 co-creadores .ppsx
SISTESIS RETO4 Grupo4 co-creadores .ppsx
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.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