Presentacion web2py

3,615 views
3,521 views

Published on

Presentación, traducida y adaptada de la original

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,615
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
93
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Presentacion web2py

  1. 1. web2py por Massimo Di Pierro Traducción y adaptación: Alfonso de la Guarda Reyes
  2. 2. Contenidos Presentación de características Interfaz basada en web (Admin) Aplicaciones (App) realmente simples Ejemplos de código
  3. 3. web2py - presentación
  4. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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)
  14. 14. web2py - admin
  15. 15. Startup No requiere instalación Unzip y click en web2py.(py|app|exe)
  16. 16. SHELL $ python.py -S myapp -M >>> print request.application myapp >>> print response.status 200 >>> db=SQLDB(‘sqlite://storage.db’)
  17. 17. Bienvenida
  18. 18. Admin
  19. 19. Admin - sitio
  20. 20. Admin
  21. 21. about app
  22. 22. Admin - diseño
  23. 23. Admin - diseño
  24. 24. Admin - diseño
  25. 25. Admin - diseño
  26. 26. Admin - diseño
  27. 27. Edición
  28. 28. APPADMIN (db admin)
  29. 29. db log
  30. 30. Probar app
  31. 31. Traducir app
  32. 32. Visualizar tickets
  33. 33. debug
  34. 34. Google App Engine (bastante de) DAL corre sobre GAE app.yaml provisto click para implementar def ruta
  35. 35. web2py - myapp
  36. 36. Arquitectura Controller FILE: myapp/controllers/default.py def index(): return “Hello Wold” minimo app request action response
  37. 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. 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. 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. 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. 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. 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. 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. 44. web2py – código ejem. SQLDB, insert, count, delete, update, select SQLFORM, helpers
  45. 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. 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. 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. 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. 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. 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. 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. 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. 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. 54. Hay miles de Usuarios web2py Unete al Google group!

×