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 featurepacked thAn rails... ...very user friendly, require no installation, no configuration, no shell scripting, no dependecies, MUST do everything via a web interface...

Web - to - Python Web2.0 in Python ... lo que prefieran

design interface

web based editor

... talk html, xml, rss, atom, json, csv, rtf, ajax, wiki, xml-rpc, rest, mysql, postgresql, oracle... ...log exceptions, generate tickets, compile and package applications, provide testing and internationalization.. ...have a strong focus on security, prevent SQL injections, xss, malicious file execution and make the web more productive and secure.

database admin interface

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 Phyo Arkar Lwin Mateusz Banach Robin Bhattacharyya Attila Csipa DenesL Timothy Farrel Bill Ferrett Nathan Freeze Francisco Gama Markus Gritsch Sterling Hankins Jose Jachuf Younghyun Jo Mark Larsen CJ Lazell Marcel Leuthi Limodou Mark Moore Niccolo Polo Stuart Rackham Kyle Smith Niall Sweeny Michael Willis Fred Yanowski Yarko Alfonso de la Guarda ... Estoy seguro de olvidar a algunos... sorry.

En la caja (app, exe)
Apps
admin
(appadmin) plugins

examples
(appadmin)

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

gluon (core libraries)

contrib

simplejson, pyrtf, feedparser, request, response, session, cache internationalization, routes, helpers, forms, pyRSS2Gen, memcache, markdown validators, template language, database API

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
FILE: myapp/models/db.py

Controlador
FILE: myapp/controllers/default.py

Vista
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
FILE: myapp/models/db.py

Controller
FILE: myapp/controllers/default.py

Vista
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
FILE: myapp/models/db.py

Controlador
FILE: myapp/controllers/default.py

Vista
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
FILE: myapp/models/db.py

Controlador
FILE: myapp/controllers/default.py

Vista
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
FILE: myapp/models/db.py db=SQLDB(‘sqlite://storage.db’) db.define_table(‘comment’, db.Field(‘body’)) db.comment.body.requires=IS_NOT_EMPTY()

Controlador
FILE: myapp/controllers/default.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)

Vista
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
FILE: myapp/models/db.py db=SQLDB(‘sqlite://storage.db’) db.define_table(‘comment’, db.Field(‘body’)) db.comment.body.requires=IS_NOT_EMPTY()

Controlador
FILE: myapp/controllers/default.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)

Vista
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
FILE: myapp/models/db.py db=SQLDB(‘sqlite://storage.db’) db.define_table(‘comment’, db.Field(‘body’)) db.comment.body.requires=IS_NOT_EMPTY()

Controlador
FILE: myapp/controllers/default.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)

Vista
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

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’) query=(db.person.id==id) db(query).count() db(query).delete() db(query).update(name=’Massimo’) rows = db(query).select(orderby=db.person.name) print rows[0].name ### SQL COUNT ### SQL DELETE ### SQL UPDATE ### SQL SELECT ### SQL INSERT

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 TD INPUT TR TD 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!

Sign up to vote on this title
UsefulNot useful