Pens an Do en Grande

28
  Pensando en grande Por Martín Mulone Nivel: Intermedio @mulonemartin

Transcript of Pens an Do en Grande

Pensando en grande

Nivel: Intermedio

Por Martn Mulone@mulonemartin

Principales caractersticas del frameworkCdigo libre y desarrollado por una comunidad. LGPL v3.0 Corre en todos lados (escrito en lenguaje Python): Win, Linux, Mac. No tiene archivos de configuracin y ninguna otra dependencia ms que el python estndar. Tiene integrado una capa de abstraccin 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 instalacin. Soporte PyPI Siempre compatible con versiones anteriores Utiliza el patrn de diseo MVC Web forms, Validators, Uploads, Helpers, Autorizaciones, Roles, etc. Administracin de aplicaciones, errores y tickets en linea. Ayuda de creacin de aplicaciones: Wizard.

Web2py: Logros obtenidos

3000 Usuarios registrados en los diferentes grupos. Siendo una comunidad muy activa y participativa. Ms 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 - ModelosModels Controllers Views Translations Modules Static FilesModels db.py menu.py

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

Arquitectura de aplicaciones del usuario - ControladoresModels Controllers Views Translations Modules Static Filesdef agregar_cliente(): form = SQLFORM(db.clientes) if form.process().accepted: response.flash = 'cliente agregado!' return dict(form=form) def agregar_productos(): form = SQLFORM(db.productos) if form.process().accepted: response.flash = 'producto agregado!' return dict(form=form)

Controllers default.py

Arquitectura de aplicaciones del usuario - Vistasagregar_producto.html

Models Controllers Views Translations Modules Static Files

{{extend 'layout.html'}} {{=form}}agregar_cliente.html

{{extend 'layout.html'}} {{=form}}layout.html {{include}} Views default agregar_producto.html agregar_cliente.html layout.html

Diagrama de funcionamiento de nuestra aplicacinAgregar Clientehttp://localhost:8000/default/agregar_cliente

Agregar Productohttp://localhost:8000/default/agregar_producto

request

request

Serverdb.py menu.py

Models

controller

controller

agregar_cliente layout.html

agregar_producto view

view

browser

browser

Diagrama de funcionamiento de nuestra applicacin + cant. modelosAgregar Clientehttp://localhost:8000/default/agregar_cliente

Agregar Productohttp://localhost:8000/default/agregar_producto

request

request

Serverclientes.py db.py facturacion.py formularios.py menu.py productos.py ventas.py settings.py

Models

Problemticas que acontecen con muchos modelosA medida que nuestra aplicacin incrementa la cantidad de modelos, decrece el rendimiento. Polucin del espacio de nombres namespace a travs de los modelos. Orden de ejecucin de modelos.

:(

Orden de ejecucin de los modelosSe leen todos los archivos .py de la carpeta models de manera secuencial y en orden alfabtico.

Models clientes.py db.py facturacion.py formularios.py menu.py productos.py ventas.py settings.py

Models 01_settings.py 02_db.py 03_menu.py 04_clientes.py 05_facturacion.py 06_productos.py 07_formularios.py 08_ventas.py

Se deben renombrar los archivos anteponiendo nmeros, para darle orden a la lgica de ejecucin de nuestros modelos. Ejemplo: No podemos definir nuestros datos si antes no conectamos a nuestra base de datos.

Uso de modelos condicionalesCarpetas con el nombre del controlador, hace que en el request slo sea tenido en cuenta los modelos que se encuentren en la carpeta correspondiente al controlador pedido.models clientes.py db.py facturacion.py formularios.py menu.py productos.py ventas.py settings.py models clientes 01_db.py 02_menu.py 03_clientes.py productos 01_db.py 02_menu.py 03_productos.py

Mejor an

Uso de mdulosModels Controllers Views Translations Modules Static FilesModules/ __init__.py clientes.py facturacion.py productos.py Basta con poner nuestros archivos .py en la carpeta modules/ que contengan nuestras libreras con clases, objetos, etc. que queremos usar en nuestras aplicaciones. Luego hacemos uso de los mismos haciendo import desde nuestros controladores o modelos.

Uso de mdulos

ANTESmodules __init__.py clientes.pymodclientes = local_import(clientes) clientes = modclientes.Clientes()

AHORAmodules __init__.py clientes.pyfrom clientes import Clientes clientes = Clientes()

Ejemplo 1 - Uso de mdulosModules/ clientes.py Models/ db.py Controllers/ clientes.py

from gluon import * class Clientes(object): """ Mtodos de cliente """ def __init__(self, db): self.db = db

db = DAL('sqlite://storage.sqlite') from clientes import Clientes def listar(): Lista los Clientes clientes = Clientes(db) clientes.define_tables() lista = clientes.listar() return dict(lista=lista)

def define_tables(self): db = self.db db.define_table('clientes', Field('nombre','string'), Field('apellido','string')) def listar(self): db = self.db return db(db.clientes>0).select()

Ejemplo 2 - Uso de mdulosModules/ miapp.py clientes.pyfrom gluon import * class MiApp(object): def __init__(self, db): self.db = db def define_tables(self): db = self.db db.define_table('clientes', Field('nombre','string'), Field('apellido','string')) db.define_table('productos', Field('nombre','string'), Field('categoria','string')) from clientes import Clientes def listar(): Lista los Clientes clientes = Clientes(db) app = MiApp(db) app.define_tables() lista = clientes.listar() return dict(lista=lista)

Models/ db.pydb = DAL('sqlite://storage.sqlite')

Controllers/ clientes.py

Usando mdulos en nuestro ambiente de desarrolloPara cada cambio en nuestros mdulos habra que reiniciar el web2py, para evitar esta prctica 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()

Mdulos: 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 mdulo 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): self.db = db response = current.response request = current.request session = current.session

Modules/ miapp.py

Cuando es necesario un uso obligatorio de mdulos

Desarrollo de plugins, extensiones u otros agregados. Dichas extensiones no deben mezclarse con la lgica principal de nuestra aplicacin en desarrollo. Se hace uso de las mismas importndolas en nuestra aplicacin.

Desarrollo de pluginsmodules plugins comments.py from gluon import * class PluginComments(object): def __init__(self, db): self.db = db def install(self): db = self.db db.define_table('comments', Field('record','integer'), Field('author_id', db.auth_user), Field('comment','text')) return self def render(self, record): db = self.db return db(db.comments.record==record).select() from clientes import Clientes from plugins.comments import PluginComments def cliente(): cli = request.vars.id clientes = Clientes(db) info = clientes.info(cli) comenta = PluginComments(db).install().render(cli) return dict(info=info, comenta=comenta)

Controllers/ clientes.py

Prcticas en el uso de controladores

EVITARcontrollers default.py

HACERcontrollers clientes.py productos.pyhttp://localhost:8000/clientes/agregar http://localhost:8000/productos/agregar

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

def agregar_cliente(): return dict() def agregar_producto(): return dict()

clientes.py productos.py

def agregar(): return dict() def agregar(): return dict()

MgiaThe 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 administracin de usuarios:

usuarios = SQLFORM.grid(db.auth_user)

Nuevo CRUD: Grid y SmartgridNos permite hacer Altas, Bajas, Modificaciones, Bsquedas, Exportar a CSV. Soporta Paginacin, Ordenar por campo, tablas referenciadas y ms. 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)

SchedulerNos permite correr tareas diferidas y/o programadas.No tiene requerimientos de libreras, usa el propio DAL para llevar la cola de tareas. Ideal para tareas largas en ejecucin. Tareas programadas: diarias, semanales, mensuales, etc. Utiliza la notacin JSON, para pasar las variables. Sencillo y liviano slo 400 lneas de cdigo. Corre en segundo plano, por lo que no est afectado por los timeouts de navegadores.

Scheduler ejemplomodels db.py tasks.pyfrom gluon.scheduler import Scheduler def populate_db(): from gluon.contrib.populate import populate 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 scheduler.pyfrom gluon.scheduler import Scheduler if __name__ == "__main__": """ Main execution """ scheduler.loop()

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

Aplicacin completa: http://bit.ly/qmHk1m

ConclusionesEs un framework de evolucin constante, actualmente en la versin 1.99, se acerca la versin 2.0 con muchos cambios en la mira. Nos permite prototipar nuestras aplicaciones de forma rpida y segura, menos tiempo de programacin mayor tiempo para la creacin y desarrollo de nuestras ideas.

Una comunidad muy activa y participativa. Anmate a probarlo y aydanos a hacerlo crecer.

Sobre el autor

Martn Mulone@mulonemartin http://martin.tecnodoc.com.ar https://bitbucket.org/mulonemartin/

Sobre web2py

Sitio oficial: www.web2py.com Grupo en espaol: groups.google.com/group/web2py-usuarios