SlideShare ist ein Scribd-Unternehmen logo
1 von 54
Downloaden Sie, um offline zu lesen
web2py
por Massimo Di Pierro
Traducción y adaptación:
Alfonso de la Guarda Reyes
Contenidos

Presentación de características

Interfaz basada en web (Admin)

Aplicaciones (App) realmente simples

Ejemplos de código
web2py - presentación
web2py (nombre)
                                            I cannot just wait while unsecure
                                          java and php applications are taking
                                           over the world wide web. we need a
                                             new super python web framework




                                                                     it needs to have a
                                                                  model-view-controller
                                                                   design but be faster
                                                                    and more feature-
                                                                    packed thAn rails...



Web - to - Python           ...very user friendly, require no
                          installation, no configuration, no
                            shell scripting, no dependecies,
                               MUST do everything via a web
                                           interface...
                                                                                                design interface




                       web based editor




Web2.0 in Python                                ... talk html, xml, rss, atom, json,
                                                 csv, rtf, ajax, wiki, xml-rpc, rest,
                                                     mysql, postgresql, oracle...
                                                                                                 database admin
                                                                                                 interface

                                                                    ...log exceptions,
                                                                    generate tickets,
                                                                  compile and package
                                                                  applications, provide




... lo que prefieran
                                                                         testing and
                                                                 internationalization..


                                                          ...have a strong focus on
                                                             security, prevent SQL
                                                       injections, xss, malicious file
                                                         execution and make the web
                                                        more productive and secure.




                                                                to serve and protect,
                                                                    free and stable
                                                                       I am web2py


                           testing interface

                                                                                        www.web2py.com
Metas
Hacer el desarrollo web lo más simple posible

Pequeño, rápido y sólido como una roca

Seguridad

Refuerza las buenas prácticas (MVC, postbacks, ...)

Promete y mantiene compatibilidad retro-activa

No maneja dependencias externas

Sintáxis, no palabras clave
COLABORADORES
Sharriff Aina         Mark Larsen
Phyo Arkar Lwin       CJ Lazell
Mateusz Banach        Marcel Leuthi
Robin Bhattacharyya   Limodou
Attila Csipa          Mark Moore
DenesL                Niccolo Polo
Timothy Farrel        Stuart Rackham
Bill Ferrett          Kyle Smith
Nathan Freeze         Niall Sweeny
Francisco Gama        Michael Willis
Markus Gritsch        Fred Yanowski
Sterling Hankins      Yarko
Jose Jachuf           Alfonso de la Guarda
Younghyun Jo
                      ... Estoy seguro de olvidar
                      a algunos... sorry.
En la caja (app, exe)
                               Apps                        plugins


                                welcome
    admin        examples       scaffolding    ...   ...   ...   T2   ...
  (appadmin)     (appadmin)     (appadmin)
                                  (jquery)




  gluon (core libraries)                             contrib
      request, response, session, cache       simplejson, pyrtf, feedparser,
 internationalization, routes, helpers, forms, pyRSS2Gen, memcache,
 validators, template language, database API          markdown



                 cherrypy wsgi server
                          python 2.5
Inspirado por Django

Diseño Modelo - Vista - Controlador
Objetos request, response y session
Generación de formularios
Validadores
Maneja cargas de archivos en formularios
urls.py/routes.py
{{...}} para escapar a código en vistas
Diferencias (con Django)

 Interfaz de admin basada en web (o shell):
    diseño,depuración,evaluación,ejecución
    traducción,implementación,error tickets
 Todo tiene defaults (vistas, rutas, etc.)
 No requiere de archivos de configuración
 El código es ejecutado no importado
 Full Python en {{...}}
Inspirado por TG/Pylons

 Auto-escape en vistas salvo XML() como Kid
 response.flash inspirado por TG
 Sintáxis DAL inspirada por SQLObjects
 DAL soporta orderby, groupby, having,
 limitby, join, left join, operators,
  selects anidados
  pool de conexiones de SQLAlchemy.
Diferencias
XML(...,sanitize=True)
incluye jQuery
DAL trabaja en SQLite, PostgreSQL, MySQL,
Oracle, MSSQL, FireBase and ...
Google App Engine (*)


(*) JOIN, OR, LIKE, IN no trabaja en GAE
Otras características
Migraciones de Bases de Datos automáticas
Sistema de Ticketing
Sistema de ayuda jerárquico (A, DIV, IMG, ...)
Menos de 300K bytes (+ apps)
3 tipos de cache (ram,disk,memcache+combinaciones)
No requiere librerías de terceros (incluye todo)
Incluye servidor cherrypy wsgi
Trabaja con (cgi), fcgi, wsgi, mod_python
Streaming de archivos integrado
Seguridad
Validación de URLs
Validación de Formularios
DAL previene SQL-injections
Vistas y helpers previenen XSS
Sesiones seguras cookies + uuid
Admin solo por https o localhost
Tickets
(reduce oportunidad de cometer errores)
web2py - admin
Startup

No requiere instalación

Unzip y click en web2py.(py|app|exe)
SHELL

$ python.py -S myapp -M

>>> print request.application
myapp
>>> print response.status
200
>>> db=SQLDB(‘sqlite://storage.db’)
Bienvenida
Admin
Admin - sitio
Admin
about app
Admin - diseño
Admin - diseño
Admin - diseño
Admin - diseño
Admin - diseño
Edición
APPADMIN (db admin)
db log
Probar app
Traducir app
Visualizar tickets
debug
Google App Engine
(bastante de) DAL corre sobre GAE

app.yaml provisto
              click para implementar




                    def ruta
web2py - myapp
Arquitectura
             Controller
   FILE: myapp/controllers/default.py


   def index():
      return “Hello Wold”
                                            minimo
                                              app




 request            action              response
Arquitectura
             Modelo                       Controlador                                       Vista
FILE: myapp/models/db.py        FILE: myapp/controllers/default.py          FILE: myapp/views/default/index.py

db=SQLDB(‘sqlite://storage.db’)

db.define_table(‘comment’, db.Field(‘body’))

db.comment.body.requires=IS_NOT_EMPTY()




  request            models   request            action              dict               view           response
Arquitectura
             Model                        Controller                                        Vista
FILE: myapp/models/db.py        FILE: myapp/controllers/default.py          FILE: myapp/views/default/index.py

db=SQLDB(‘sqlite://storage.db’)

db.define_table(‘comment’, db.Field(‘body’))

db.comment.body.requires=IS_NOT_EMPTY()




  request            models   request            action              dict               view           response
Arquitectura
             Modelo                       Controlador                                       Vista
FILE: myapp/models/db.py        FILE: myapp/controllers/default.py          FILE: myapp/views/default/index.py

                                def index():
                                   f=SQLFORM(db.comment)
                                   if f.accepts(request.vars):
                                        response.flash=T(’comment posted’)
                                   c=db().select(db.comment.ALL)
                                   return dict(form=f, comments=c)




  request            models   request            action              dict               view           response
Arquitectura
             Modelo                       Controlador                                       Vista
FILE: myapp/models/db.py        FILE: myapp/controllers/default.py          FILE: myapp/views/default/index.py


                                                    {{extend ‘layout.html’}}
                                                    <ul>
                                                     {{for comment in comments:}}
                                                     <li>{{=comment.body}}</li>
                                                     {{pass}}
                                                    </ul>
                                                     {{=form}}




  request            models   request            action              dict               view           response
Arquitectura
               Modelo                                    Controlador                                        Vista
FILE: myapp/models/db.py                       FILE: myapp/controllers/default.py           FILE: myapp/views/default/index.py

db=SQLDB(‘sqlite://storage.db’)                def index():                                 {{extend ‘layout.html’}}
                                                  f=SQLFORM(db.comment)                     <ul>
db.define_table(‘comment’, db.Field(‘body’))      if f.accepts(request.vars):                {{for comment in comments:}}
                                                       response.flash=T(’comment posted’)    <li>{{=comment.body}}</li>
db.comment.body.requires=IS_NOT_EMPTY()           c=db().select(db.comment.ALL)              {{pass}}
                                                  return dict(form=f, comments=c)           </ul>
                                                                                             {{=form}}




  request              models             request               action              dict                view           response
Arquitectura
               Modelo                                    Controlador                                        Vista
FILE: myapp/models/db.py                       FILE: myapp/controllers/default.py           FILE: myapp/views/default/index.py

db=SQLDB(‘sqlite://storage.db’)                def index():                                 {{extend ‘layout.html’}}
                                                  f=SQLFORM(db.comment)                     <ul>
db.define_table(‘comment’, db.Field(‘body’))      if f.accepts(request.vars):                {{for comment in comments:}}
                                                       response.flash=T(’comment posted’)    <li>{{=comment.body}}</li>
db.comment.body.requires=IS_NOT_EMPTY()           c=db().select(db.comment.ALL)              {{pass}}
                                                  return dict(form=f, comments=c)           </ul>
                                                                                             {{=form}}




  request              models             request               action              dict                view           response
Arquitectura
               Modelo                                    Controlador                                        Vista
FILE: myapp/models/db.py                       FILE: myapp/controllers/default.py           FILE: myapp/views/default/index.py

db=SQLDB(‘sqlite://storage.db’)                def index():                                 {{extend ‘layout.html’}}
                                                  f=SQLFORM(db.comment)                     <ul>
db.define_table(‘comment’, db.Field(‘body’))      if f.accepts(request.vars):                {{for comment in comments:}}
                                                       response.flash=T(’comment posted’)    <li>{{=comment.body}}</li>
db.comment.body.requires=IS_NOT_EMPTY()           c=db().select(db.comment.ALL)              {{pass}}
                                                  return dict(form=f, comments=c)           </ul>
                                                                                             {{=form}}




  request              models             request               action              dict                view           response
web2py – código ejem.
  SQLDB, insert, count, delete, update, select
           SQLFORM, helpers
Dal
db = SQLDB(‘postgres://user:pass@hostname/db’, pools=10)

db.define_table(‘person’,db.Field(’name’,’string’))

id= db.person.insert(name=’Max’)                           ### SQL INSERT

query=(db.person.id==id)

db(query).count()                                          ### SQL COUNT

db(query).delete()                                         ### SQL DELETE

db(query).update(name=’Massimo’)                           ### SQL UPDATE

rows = db(query).select(orderby=db.person.name)            ### SQL SELECT

print rows[0].name
DAL- INNER JOIN

db.define_table(‘dog’,db.Field(’name’))

db.define_table(‘friendship’, db.Field(’person’,db.person), db.Field(‘dog’,db.dog))

db.friendship.insert(person=id, dog=db.dog.insert(name=’Snoopy’))

friends=(db.person.id==db.friendship.person)&(db.dog.id==db.friendship.dog)

rows = db(friends).select(db.person.name, db.dog.name)

for row in rows: print row.person.name, ’is friend of’, row.dog.name
DAL - LEFT JOIN


query=(db.person.id>0)

friends=(db.person.id==db.friendship.person)&(db.dog.id==db.friendship.dog)

rows = db(query).select(db.person.name, db.dog.name, left=db.dog.on(friends))

for row in rows: print row.person.name, ’is friend of’, row.dog.name or ‘nobody’
Queries complejos

query = (db.person.id==1)|((db.person.id==2)&(db.person.name==’Max’))

query = (db.person.id==db.friendship.person)&(db.dog.id==db.friendship.dog)

query = db.person.name.lower().like(‘m%’)

query = (db.person.id.belongs(db()._select(db.friendship.person))

query = (db.person.birth.year()+1==2008)




rows = db(query).select()
DAL - I/o

Input

   db.person.import_from_csv_file(open(filename,’rb’))

Select

   rows = db(...).select(...,orderby=...,groupby=...,having=...,limitby=...,cache=...)

Output in CSV

   print str(rows)

Output in HTML

   print rows.xml()
SQLFORM

db.person.name.requires=IS_NOT_IN_DB(db,db.person.name)

db.friendship.person.requires=IS_IN_DB(db,db.person.id,’%(name)s’)


                                           make dropboxes
form = SQLFORM(db.friendship)

if form.accepts(request.vars, session): response.flash=’record inserted’

elif form.errors: response.flash=’form errors’

{{=form}}
HELPERs
form = FORM(TABLE(TR(TD(INPUT(_name=’n’))),TR(TD(INPUT(_type=’submit’)))))

form[0][1][0][‘_class’]=’myclass’
                                                        FORM
                                                        TABLE
                                                   TR           TR

                                                   TD           TD

                                                 INPUT      INPUT



if form.accepts(request.vars, session): response.flash=’record inserted’

elif form.errors: response.flash=’form errors’

{{=form}}
T2
Extended CRUD: t2.create, t2.display, t2.update, t2.delete, t2.itemize, t2.search

   def create_person(): return dict(form=t2.create(db.person))




Authentication, Authorization, and Group Based Access Control

   def login(): return dict(form=t2.login())

   @t2.requires_login() # decorator




Attachments, Comments, and Reviews

   def view_person(): return dict(p=t2.display(db.person),c=t2.comments(db.person))
Conclusiones

web2py está aquí

web2py es estable desde Oct 2007

web2py cada día tiene nuevas característ.

web2py se mueve al siguiente nivel(T2.T3.)

Al usarlo, te divertirás de verdad!!!
Hay miles de
  Usuarios web2py
Unete al Google group!

Weitere ähnliche Inhalte

Was ist angesagt?

Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Facescok12v
 
Curso Java Resumen - Curso 2005-2006
Curso Java Resumen - Curso 2005-2006Curso Java Resumen - Curso 2005-2006
Curso Java Resumen - Curso 2005-2006Samuel Marrero
 
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-20065. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006Samuel Marrero
 
Integración de aplicaciones Java
Integración de aplicaciones JavaIntegración de aplicaciones Java
Integración de aplicaciones JavaIker Canarias
 
Plataforma de programación Java
Plataforma de programación JavaPlataforma de programación Java
Plataforma de programación JavaAntonio Contreras
 
Breve introducción a Apache Ant
Breve introducción a Apache AntBreve introducción a Apache Ant
Breve introducción a Apache AntIker Canarias
 
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
 
Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado   1 IntroduccióN Al Desarrollo WebCurso Java Avanzado   1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado 1 IntroduccióN Al Desarrollo WebEmilio Aviles Avila
 
JBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server FacesJBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server FacesAitor Acedo
 
Aplicaciones web con jakarta struts - Javier Oliver Fulguera
Aplicaciones web con jakarta struts  - Javier Oliver FulgueraAplicaciones web con jakarta struts  - Javier Oliver Fulguera
Aplicaciones web con jakarta struts - Javier Oliver FulgueraJavier Oliver Fulguera
 

Was ist angesagt? (20)

spring
springspring
spring
 
Introducción a JEE
Introducción a JEEIntroducción a JEE
Introducción a JEE
 
Curso Java Avanzado 5 Ejb
Curso Java Avanzado   5 EjbCurso Java Avanzado   5 Ejb
Curso Java Avanzado 5 Ejb
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Faces
 
Curso Java Resumen - Curso 2005-2006
Curso Java Resumen - Curso 2005-2006Curso Java Resumen - Curso 2005-2006
Curso Java Resumen - Curso 2005-2006
 
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-20065. Curso Java Struts I (Framework para Java) - Curso 2005-2006
5. Curso Java Struts I (Framework para Java) - Curso 2005-2006
 
Documento Web2Py
Documento Web2PyDocumento Web2Py
Documento Web2Py
 
Curso introductorio a Raptor.js con Node.js
Curso introductorio a Raptor.js con Node.jsCurso introductorio a Raptor.js con Node.js
Curso introductorio a Raptor.js con Node.js
 
Integración de aplicaciones Java
Integración de aplicaciones JavaIntegración de aplicaciones Java
Integración de aplicaciones Java
 
Plataforma de programación Java
Plataforma de programación JavaPlataforma de programación Java
Plataforma de programación Java
 
01 introducción
01 introducción01 introducción
01 introducción
 
Struts en Java
Struts en JavaStruts en Java
Struts en Java
 
Manual Basico De Struts
Manual Basico De StrutsManual Basico De Struts
Manual Basico De Struts
 
Breve introducción a Apache Ant
Breve introducción a Apache AntBreve introducción a Apache Ant
Breve introducción a Apache Ant
 
Tecnologias web
Tecnologias webTecnologias web
Tecnologias web
 
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
 
Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado   1 IntroduccióN Al Desarrollo WebCurso Java Avanzado   1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
 
JBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server FacesJBossAS: Desarrollo con Java Server Faces
JBossAS: Desarrollo con Java Server Faces
 
Sesion03 apuntes
Sesion03 apuntesSesion03 apuntes
Sesion03 apuntes
 
Aplicaciones web con jakarta struts - Javier Oliver Fulguera
Aplicaciones web con jakarta struts  - Javier Oliver FulgueraAplicaciones web con jakarta struts  - Javier Oliver Fulguera
Aplicaciones web con jakarta struts - Javier Oliver Fulguera
 

Andere mochten auch (7)

Sis 2015 saludpol
Sis 2015 saludpolSis 2015 saludpol
Sis 2015 saludpol
 
Ingenieria Reversa de Puertos Series con algo de Python
Ingenieria Reversa de Puertos Series con algo de PythonIngenieria Reversa de Puertos Series con algo de Python
Ingenieria Reversa de Puertos Series con algo de Python
 
Por qué python?
Por qué python?Por qué python?
Por qué python?
 
Expo salud pol fcg
Expo salud pol fcgExpo salud pol fcg
Expo salud pol fcg
 
Presentación SaludPol Piura
Presentación SaludPol PiuraPresentación SaludPol Piura
Presentación SaludPol Piura
 
Sistemas De Salud Pps
Sistemas De Salud PpsSistemas De Salud Pps
Sistemas De Salud Pps
 
Sis ii
Sis  iiSis  ii
Sis ii
 

Ähnlich wie Presentacion web2py

Seminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightSeminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightParadigma Digital
 
Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18Young Suk Ahn Park
 
Symfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony FrameworkSymfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony Frameworkexcedesoft
 
Code Blast 2012 - Fast Mobile Prototyping
Code Blast 2012 - Fast Mobile PrototypingCode Blast 2012 - Fast Mobile Prototyping
Code Blast 2012 - Fast Mobile PrototypingINSIGNIA4U
 
Arquitectura e-sijad
Arquitectura e-sijadArquitectura e-sijad
Arquitectura e-sijade-gim
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microserviciosPedro J. Molina
 
Business Logic 2012
Business Logic 2012Business Logic 2012
Business Logic 2012juanma_ari
 
Desymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: BackendDesymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: BackendJavier Eguiluz
 
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
 
Adf. El Framework De Desarrollo De Fusion V7.0
Adf. El Framework De Desarrollo De Fusion V7.0Adf. El Framework De Desarrollo De Fusion V7.0
Adf. El Framework De Desarrollo De Fusion V7.0Pedro Gallardo
 
FMK Capa de Presentacion
FMK Capa de PresentacionFMK Capa de Presentacion
FMK Capa de Presentacionkaolong
 
Introdución a aplicaciones web en java
Introdución a aplicaciones web en java Introdución a aplicaciones web en java
Introdución a aplicaciones web en java Rodrigo Zottola Pareja
 
Presentacion Hanuman
Presentacion HanumanPresentacion Hanuman
Presentacion Hanumanfelixgborrego
 
Ruby On Rails Intro
Ruby On Rails IntroRuby On Rails Intro
Ruby On Rails IntroThirdWay
 
J2 Ee Para Seres Humanos Slides
J2 Ee Para Seres Humanos SlidesJ2 Ee Para Seres Humanos Slides
J2 Ee Para Seres Humanos Slidesmundojava
 

Ähnlich wie Presentacion web2py (20)

Seminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring InsightSeminario Spring Roo. Monitorización con Spring Insight
Seminario Spring Roo. Monitorización con Spring Insight
 
Breve introducción práctica al DevOps - (es) 2021_03_18
Breve introducción práctica al DevOps -  (es) 2021_03_18Breve introducción práctica al DevOps -  (es) 2021_03_18
Breve introducción práctica al DevOps - (es) 2021_03_18
 
Symfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony FrameworkSymfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony Framework
 
Rails intro
Rails introRails intro
Rails intro
 
Arquitectura
Arquitectura Arquitectura
Arquitectura
 
Code Blast 2012 - Fast Mobile Prototyping
Code Blast 2012 - Fast Mobile PrototypingCode Blast 2012 - Fast Mobile Prototyping
Code Blast 2012 - Fast Mobile Prototyping
 
Iphone
IphoneIphone
Iphone
 
Mvc
MvcMvc
Mvc
 
Rational unified process (rup)
Rational unified process (rup)Rational unified process (rup)
Rational unified process (rup)
 
Arquitectura e-sijad
Arquitectura e-sijadArquitectura e-sijad
Arquitectura e-sijad
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microservicios
 
Business Logic 2012
Business Logic 2012Business Logic 2012
Business Logic 2012
 
Desymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: BackendDesymfony 2011 - Tutorial #5: Backend
Desymfony 2011 - Tutorial #5: Backend
 
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
 
Adf. El Framework De Desarrollo De Fusion V7.0
Adf. El Framework De Desarrollo De Fusion V7.0Adf. El Framework De Desarrollo De Fusion V7.0
Adf. El Framework De Desarrollo De Fusion V7.0
 
FMK Capa de Presentacion
FMK Capa de PresentacionFMK Capa de Presentacion
FMK Capa de Presentacion
 
Introdución a aplicaciones web en java
Introdución a aplicaciones web en java Introdución a aplicaciones web en java
Introdución a aplicaciones web en java
 
Presentacion Hanuman
Presentacion HanumanPresentacion Hanuman
Presentacion Hanuman
 
Ruby On Rails Intro
Ruby On Rails IntroRuby On Rails Intro
Ruby On Rails Intro
 
J2 Ee Para Seres Humanos Slides
J2 Ee Para Seres Humanos SlidesJ2 Ee Para Seres Humanos Slides
J2 Ee Para Seres Humanos Slides
 

Mehr von Alfonso de la Guarda Reyes (9)

Aplicaciones de E-health para ayuda al diagnostico
Aplicaciones de E-health para ayuda al diagnosticoAplicaciones de E-health para ayuda al diagnostico
Aplicaciones de E-health para ayuda al diagnostico
 
Proyecto COS
Proyecto COSProyecto COS
Proyecto COS
 
Presentacion imagenologia SINPA
Presentacion imagenologia SINPAPresentacion imagenologia SINPA
Presentacion imagenologia SINPA
 
Arquitecturas Libres en E-Health
Arquitecturas Libres en E-HealthArquitecturas Libres en E-Health
Arquitecturas Libres en E-Health
 
Ehealth y Software Libre, una visión
Ehealth y Software Libre, una visiónEhealth y Software Libre, una visión
Ehealth y Software Libre, una visión
 
Military Research and Development with FLOSS
Military Research and Development with FLOSSMilitary Research and Development with FLOSS
Military Research and Development with FLOSS
 
GIS
GISGIS
GIS
 
Presentacion Blender
Presentacion BlenderPresentacion Blender
Presentacion Blender
 
Investigación y Desarrollo Tecnológico con FLOSS en el EPE
Investigación y Desarrollo Tecnológico con FLOSS en el EPEInvestigación y Desarrollo Tecnológico con FLOSS en el EPE
Investigación y Desarrollo Tecnológico con FLOSS en el EPE
 

Kürzlich hochgeladen

Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel tallerValentinaTabares11
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificialcynserafini89
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 

Kürzlich hochgeladen (20)

Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel taller
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificial
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 

Presentacion web2py

  • 1. web2py por Massimo Di Pierro Traducción y adaptación: Alfonso de la Guarda Reyes
  • 2. Contenidos Presentación de características Interfaz basada en web (Admin) Aplicaciones (App) realmente simples Ejemplos de código
  • 4. web2py (nombre) I cannot just wait while unsecure java and php applications are taking over the world wide web. we need a new super python web framework it needs to have a model-view-controller design but be faster and more feature- packed thAn rails... Web - to - Python ...very user friendly, require no installation, no configuration, no shell scripting, no dependecies, MUST do everything via a web interface... design interface web based editor Web2.0 in Python ... talk html, xml, rss, atom, json, csv, rtf, ajax, wiki, xml-rpc, rest, mysql, postgresql, oracle... database admin interface ...log exceptions, generate tickets, compile and package applications, provide ... lo que prefieran testing and internationalization.. ...have a strong focus on security, prevent SQL injections, xss, malicious file execution and make the web more productive and secure. to serve and protect, free and stable I am web2py testing interface www.web2py.com
  • 5. Metas Hacer el desarrollo web lo más simple posible Pequeño, rápido y sólido como una roca Seguridad Refuerza las buenas prácticas (MVC, postbacks, ...) Promete y mantiene compatibilidad retro-activa No maneja dependencias externas Sintáxis, no palabras clave
  • 6. COLABORADORES Sharriff Aina Mark Larsen Phyo Arkar Lwin CJ Lazell Mateusz Banach Marcel Leuthi Robin Bhattacharyya Limodou Attila Csipa Mark Moore DenesL Niccolo Polo Timothy Farrel Stuart Rackham Bill Ferrett Kyle Smith Nathan Freeze Niall Sweeny Francisco Gama Michael Willis Markus Gritsch Fred Yanowski Sterling Hankins Yarko Jose Jachuf Alfonso de la Guarda Younghyun Jo ... Estoy seguro de olvidar a algunos... sorry.
  • 7. En la caja (app, exe) Apps plugins welcome admin examples scaffolding ... ... ... T2 ... (appadmin) (appadmin) (appadmin) (jquery) gluon (core libraries) contrib request, response, session, cache simplejson, pyrtf, feedparser, internationalization, routes, helpers, forms, pyRSS2Gen, memcache, validators, template language, database API markdown cherrypy wsgi server python 2.5
  • 8. Inspirado por Django Diseño Modelo - Vista - Controlador Objetos request, response y session Generación de formularios Validadores Maneja cargas de archivos en formularios urls.py/routes.py {{...}} para escapar a código en vistas
  • 9. Diferencias (con Django) Interfaz de admin basada en web (o shell): diseño,depuración,evaluación,ejecución traducción,implementación,error tickets Todo tiene defaults (vistas, rutas, etc.) No requiere de archivos de configuración El código es ejecutado no importado Full Python en {{...}}
  • 10. Inspirado por TG/Pylons Auto-escape en vistas salvo XML() como Kid response.flash inspirado por TG Sintáxis DAL inspirada por SQLObjects DAL soporta orderby, groupby, having, limitby, join, left join, operators, selects anidados pool de conexiones de SQLAlchemy.
  • 11. Diferencias XML(...,sanitize=True) incluye jQuery DAL trabaja en SQLite, PostgreSQL, MySQL, Oracle, MSSQL, FireBase and ... Google App Engine (*) (*) JOIN, OR, LIKE, IN no trabaja en GAE
  • 12. Otras características Migraciones de Bases de Datos automáticas Sistema de Ticketing Sistema de ayuda jerárquico (A, DIV, IMG, ...) Menos de 300K bytes (+ apps) 3 tipos de cache (ram,disk,memcache+combinaciones) No requiere librerías de terceros (incluye todo) Incluye servidor cherrypy wsgi Trabaja con (cgi), fcgi, wsgi, mod_python Streaming de archivos integrado
  • 13. Seguridad Validación de URLs Validación de Formularios DAL previene SQL-injections Vistas y helpers previenen XSS Sesiones seguras cookies + uuid Admin solo por https o localhost Tickets (reduce oportunidad de cometer errores)
  • 15. Startup No requiere instalación Unzip y click en web2py.(py|app|exe)
  • 16. SHELL $ python.py -S myapp -M >>> print request.application myapp >>> print response.status 200 >>> db=SQLDB(‘sqlite://storage.db’)
  • 18. Admin
  • 20. Admin
  • 33. debug
  • 34. Google App Engine (bastante de) DAL corre sobre GAE app.yaml provisto click para implementar def ruta
  • 36. Arquitectura Controller FILE: myapp/controllers/default.py def index(): return “Hello Wold” minimo app request action response
  • 37. Arquitectura Modelo Controlador Vista FILE: myapp/models/db.py FILE: myapp/controllers/default.py FILE: myapp/views/default/index.py db=SQLDB(‘sqlite://storage.db’) db.define_table(‘comment’, db.Field(‘body’)) db.comment.body.requires=IS_NOT_EMPTY() request models request action dict view response
  • 38. Arquitectura Model Controller Vista FILE: myapp/models/db.py FILE: myapp/controllers/default.py FILE: myapp/views/default/index.py db=SQLDB(‘sqlite://storage.db’) db.define_table(‘comment’, db.Field(‘body’)) db.comment.body.requires=IS_NOT_EMPTY() request models request action dict view response
  • 39. Arquitectura Modelo Controlador Vista FILE: myapp/models/db.py FILE: myapp/controllers/default.py FILE: myapp/views/default/index.py def index(): f=SQLFORM(db.comment) if f.accepts(request.vars): response.flash=T(’comment posted’) c=db().select(db.comment.ALL) return dict(form=f, comments=c) request models request action dict view response
  • 40. Arquitectura Modelo Controlador Vista FILE: myapp/models/db.py FILE: myapp/controllers/default.py FILE: myapp/views/default/index.py {{extend ‘layout.html’}} <ul> {{for comment in comments:}} <li>{{=comment.body}}</li> {{pass}} </ul> {{=form}} request models request action dict view response
  • 41. Arquitectura Modelo Controlador Vista FILE: myapp/models/db.py FILE: myapp/controllers/default.py FILE: myapp/views/default/index.py db=SQLDB(‘sqlite://storage.db’) def index(): {{extend ‘layout.html’}} f=SQLFORM(db.comment) <ul> db.define_table(‘comment’, db.Field(‘body’)) if f.accepts(request.vars): {{for comment in comments:}} response.flash=T(’comment posted’) <li>{{=comment.body}}</li> db.comment.body.requires=IS_NOT_EMPTY() c=db().select(db.comment.ALL) {{pass}} return dict(form=f, comments=c) </ul> {{=form}} request models request action dict view response
  • 42. Arquitectura Modelo Controlador Vista FILE: myapp/models/db.py FILE: myapp/controllers/default.py FILE: myapp/views/default/index.py db=SQLDB(‘sqlite://storage.db’) def index(): {{extend ‘layout.html’}} f=SQLFORM(db.comment) <ul> db.define_table(‘comment’, db.Field(‘body’)) if f.accepts(request.vars): {{for comment in comments:}} response.flash=T(’comment posted’) <li>{{=comment.body}}</li> db.comment.body.requires=IS_NOT_EMPTY() c=db().select(db.comment.ALL) {{pass}} return dict(form=f, comments=c) </ul> {{=form}} request models request action dict view response
  • 43. Arquitectura Modelo Controlador Vista FILE: myapp/models/db.py FILE: myapp/controllers/default.py FILE: myapp/views/default/index.py db=SQLDB(‘sqlite://storage.db’) def index(): {{extend ‘layout.html’}} f=SQLFORM(db.comment) <ul> db.define_table(‘comment’, db.Field(‘body’)) if f.accepts(request.vars): {{for comment in comments:}} response.flash=T(’comment posted’) <li>{{=comment.body}}</li> db.comment.body.requires=IS_NOT_EMPTY() c=db().select(db.comment.ALL) {{pass}} return dict(form=f, comments=c) </ul> {{=form}} request models request action dict view response
  • 44. web2py – código ejem. SQLDB, insert, count, delete, update, select SQLFORM, helpers
  • 45. Dal db = SQLDB(‘postgres://user:pass@hostname/db’, pools=10) db.define_table(‘person’,db.Field(’name’,’string’)) id= db.person.insert(name=’Max’) ### SQL INSERT query=(db.person.id==id) db(query).count() ### SQL COUNT db(query).delete() ### SQL DELETE db(query).update(name=’Massimo’) ### SQL UPDATE rows = db(query).select(orderby=db.person.name) ### SQL SELECT print rows[0].name
  • 46. DAL- INNER JOIN db.define_table(‘dog’,db.Field(’name’)) db.define_table(‘friendship’, db.Field(’person’,db.person), db.Field(‘dog’,db.dog)) db.friendship.insert(person=id, dog=db.dog.insert(name=’Snoopy’)) friends=(db.person.id==db.friendship.person)&(db.dog.id==db.friendship.dog) rows = db(friends).select(db.person.name, db.dog.name) for row in rows: print row.person.name, ’is friend of’, row.dog.name
  • 47. DAL - LEFT JOIN query=(db.person.id>0) friends=(db.person.id==db.friendship.person)&(db.dog.id==db.friendship.dog) rows = db(query).select(db.person.name, db.dog.name, left=db.dog.on(friends)) for row in rows: print row.person.name, ’is friend of’, row.dog.name or ‘nobody’
  • 48. Queries complejos query = (db.person.id==1)|((db.person.id==2)&(db.person.name==’Max’)) query = (db.person.id==db.friendship.person)&(db.dog.id==db.friendship.dog) query = db.person.name.lower().like(‘m%’) query = (db.person.id.belongs(db()._select(db.friendship.person)) query = (db.person.birth.year()+1==2008) rows = db(query).select()
  • 49. DAL - I/o Input db.person.import_from_csv_file(open(filename,’rb’)) Select rows = db(...).select(...,orderby=...,groupby=...,having=...,limitby=...,cache=...) Output in CSV print str(rows) Output in HTML print rows.xml()
  • 50. SQLFORM db.person.name.requires=IS_NOT_IN_DB(db,db.person.name) db.friendship.person.requires=IS_IN_DB(db,db.person.id,’%(name)s’) make dropboxes form = SQLFORM(db.friendship) if form.accepts(request.vars, session): response.flash=’record inserted’ elif form.errors: response.flash=’form errors’ {{=form}}
  • 51. HELPERs form = FORM(TABLE(TR(TD(INPUT(_name=’n’))),TR(TD(INPUT(_type=’submit’))))) form[0][1][0][‘_class’]=’myclass’ FORM TABLE TR TR TD TD INPUT INPUT if form.accepts(request.vars, session): response.flash=’record inserted’ elif form.errors: response.flash=’form errors’ {{=form}}
  • 52. T2 Extended CRUD: t2.create, t2.display, t2.update, t2.delete, t2.itemize, t2.search def create_person(): return dict(form=t2.create(db.person)) Authentication, Authorization, and Group Based Access Control def login(): return dict(form=t2.login()) @t2.requires_login() # decorator Attachments, Comments, and Reviews def view_person(): return dict(p=t2.display(db.person),c=t2.comments(db.person))
  • 53. Conclusiones web2py está aquí web2py es estable desde Oct 2007 web2py cada día tiene nuevas característ. web2py se mueve al siguiente nivel(T2.T3.) Al usarlo, te divertirás de verdad!!!
  • 54. Hay miles de Usuarios web2py Unete al Google group!