際際滷

際際滷Share a Scribd company logo
TurboGears, framework de
Python per aplicacions web
I Jornades GPL Tarragona
29 de Gener de 2009
Toms Reverter Morell坦
tomas.reverter@lotomas.net
http://lotomas.net
Llic竪ncia Creative Commons BY-SA


Reconeixement-Compartir amb la mateixa llic竪ncia 3.0 Espanya
Sou lliure de:

                  copiar, distribuir i comunicar p炭blicament l'obra

                  fer-ne obres derivades

Amb les condicions seg端ents:
                  Reconeixement. Heu de recon竪ixer els cr竪dits de l'obra de la manera
                  especificada per l'autor o el llicenciador (per嘆 no d'una manera que
                  suggereixi que us donen suport o rebeu suport per l'炭s que feu l'obra).
                  Compartir amb la mateixa llic竪ncia. Si altereu o transformeu aquesta obra,
                  o en genereu obres derivades, nom辿s podeu distribuir l'obra resultant amb la
                  mateixa llic竪ncia, una de similar o una de compatible.

 Quan reutilitzeu o distribu誰u l'obra, heu de deixar ben clar els termes de la llic竪ncia de l'obra.

 Alguna de les condicions pot no aplicar-se si obteniu el perm鱈s del titular dels drets d'autor.

 No hi ha res en aquesta llic竪ncia que menyscabi o restringeixi els drets morals de l'autor.

                   http://creativecommons.org/licenses/by-sa/3.0/es/deed.ca


                 TurboGears, framework de Python per aplicacions web                                  2
Taula de contingut

1. Qu竪 辿s TurboGears? I un framework?
2. Components, components i m辿s components
3. Model-Vista-Control i l'estructura de TurboGears
4. Hands-on-lab: com crear un wiki en 20 minuts
5. Exemples d'aplicacions amb TurboGears
6. Conclusions




        TurboGears, framework de Python per aplicacions web   3
Qu竪 辿s TurboGears?

 TurboGears 辿s un framework web basat en
 Python, un mega-framework
       Comparable a Ruby On Rails i CakePHP
 Permet construir aplicacions web orientades a
 bases de dades
 Constru誰t amb arquitectura MVC
 Codi obert (llic竪ncia MIT, compatible GPL)
 Multiplataforma
 Projecte amb gaireb辿 5 anys de vida
       Versi坦 estable 1.0.8
       Versi坦 2.0 en beta 4



      TurboGears, framework de Python per aplicacions web   4
I un framework?

  I un framework?
     A software framework is an abstraction in which
     common code providing generic functionality can
     be selectively overridden or specialized by user
     code providing specific functionality. ... the overall
     program's flow of control is not dictated by the
     caller, but by the framework. This inversion of
     control is the distinguishing feature of software
     frameworks. [Wikipedia]
  Un framework 辿s una pe巽a de programari
  sobre el que pugem els desenvolupadors per
  aprofitar funcionalitats comuns
        pugem = Inversion of Control!
  No hem de reinventar la roda!
  A la prctica = un esquelet en que basar-te

       TurboGears, framework de Python per aplicacions web    5
Model-Vista-Control (MVC)

  El MVC 辿s un patr坦 arquitect嘆nic de l'enginyeria del
  programari
  Busca la separaci坦 de components per simplificar les
  aplicacions
           Independitza la presentaci坦 de les dades
  Parts:
           Model: s'encarrega de la persist竪ncia, la base de dades
           Vista: la UI del client, la capa de presentaci坦
           Control: la l嘆gica del servidor




           TurboGears, framework de Python per aplicacions web       6
Flux del Model-Vista-Control (MVC)

  L'usuari interactua amb la interf鱈cie grfica
  dissenyada a la vista
  El control manega l'entrada de l'usuari, redirigint la
  petici坦 a una pe巽a de codi m辿s espec鱈fica
  El control actualitza la informaci坦 del model
  La vista utilitza el model per generar la nova
  interf鱈cie d'usuari
  La interf鱈cie resta a l'espera de l'acci坦 de l'usuari




        TurboGears, framework de Python per aplicacions web   7
Components, components i components

                            Client-side JavaScript
                                     Mochikit
                            Template engine
                                     Kid
                            Servidor d'aplicacions
                                     CherryPy
                            Abstracci坦 base de dades (ORM)
                                     SQLObject
                            I molts m辿s...
                                FormEncode, Nose, simplejson,
                                SQLAlchemy, Genshi, Identity
                                Management...


     TurboGears, framework de Python per aplicacions web        8
Model-Vista-Control (MVC) i
l'estructura de TurboGears
                                                  Filosofia Jack el
                                                  Destripador:
                                                  anem per parts
                                                  En cada component
                                                  es poden utilitzar
                                                  diverses solucions




      TurboGears, framework de Python per aplicacions web             9
Model-Vista-Control (MVC) i
l'estructura de TurboGears
                                                  Filosofia Jack el
                                                  Destripador:
                                                  anem per parts
                                                  En cada component
                                                  es poden utilitzar
                                                  diverses solucions




      TurboGears, framework de Python per aplicacions web             10
Hands-on-lab: un wiki en 20 minuts

  Demostraci坦 prctica del funcionament de
  TurboGears
  Desenvoluparem una aplicaci坦 web que ens doni
  la funcionalitat de wiki:
       Guardar informaci坦 per paraules
       Fcil edici坦 de continguts
       Reconeixement de sintaxis CamelCase (per enlla巽os)
       URLs boniques
       Sortida en XML/JSON
       Ginys a la interf鱈cie en AJAX




       TurboGears, framework de Python per aplicacions web   11
Hands-on-lab: requeriments

  Els requeriments per realitzar aquesta demo s坦n:
       TurboGears 1.0.x
                 GNU/Linux, MacOSX o Windows
                 Python >= 2.3.x, <= 2.5.x (no 2.6 ni 3k)
                 Connexi坦 a internet (easy_install)
       Base de dades (MySQL, SQLite, PostgreSQL...)
  Opcionalment, un IDE per Python
       Eclipse
       EasyEclipse for Python
       VIM




       TurboGears, framework de Python per aplicacions web   12
Hands-on-lab: passos que seguirem

1. Crear l'esquelet de l'aplicaci坦 (quickstart)
2. Definir el model de dades
       
           Crear la base de dades
       
           Escriure dades de mostra
3. Escriure les plantilles de la vista
4. Escriure el controlador en Python
5. Rubricar amb JSON i AJAX




           TurboGears, framework de Python per aplicacions web   13
QuickStart: obrint el past鱈s

  Crear un esquelet de projecte des de zero
  $ tg-admin quickstart
  Enter project name: gplWiki20
  Enter package name [wiki20]: gplWiki20
  Do you need Identity (usernames/passwords) in this
  project? [no] no
  ...output...
  cd gplWiki20

  Amb aix嘆 ja tenim un esquelet d'aplicaci坦 web
  totalment funcional




       TurboGears, framework de Python per aplicacions web   14
I no fa falta servidor web?

  Als requeriments, no hi ha servidor web!!!
        CherryPy ja est integrat amb TurboGears
  Per arrancar l'aplicaci坦:
  cd gplWiki20
  python start-gplwiki20.py
  Punt d'entrada -> http://localhost:8080
  Tant senzill com aix嘆!




        TurboGears, framework de Python per aplicacions web   15
Llei del m鱈nim esfor巽: definint el
model via ORM
  Model centralitzat en un fitxer:
     gplwiki20/model.py
  Definim la entitat Page:
  class Page(SQLObject):
     pagename = UnicodeCol(alternateID=True,length=30)
     data = UnicodeCol()

  Amb aquesta definici坦 d'SQLObject en tenim prou
  (Vigilar amb els tabuladors, que formen part de la
  sintaxi del Python!)




        TurboGears, framework de Python per aplicacions web   16
Creaci坦 de les taules a la base de dades

  Primer hem de configurar la base de dades
        Dos fitxers de configuraci坦 espec鱈fics, desenvolupament
        (dev.cfg) i per producci坦 (prod.cfg)

  Fitxer dev.cfg
  sqlobject.dburi="mysql://us:pwd@localhost/gplWiki20"

  Crear la base de dades en si
  echo "create database gplWiki20" | mysql -u root

  Sou SQL-desconfiats? Anem a veure que executar:
  tg-admin sql sql

  Ara, a crear taules en una comanda:
  tg-admin sql create



        TurboGears, framework de Python per aplicacions web   17
Utilizant dummies pels crash-tests

  La informaci坦 per proves es pot entrar fcilment des
  de la toolboox de TurboGears
  tg-admin toolbox
  Ens portar a http://localhost:7654/
        Anar a CatWalk
        Clic a Page
        Add Page amb el nom FrontPage
  El toolbox pot ajudar per moltes m辿s coses:
        Informaci坦 de TurboGears (paquets, versions...)
        WidgetBrowser, veure les capacitats dels widgets (!!!!)
        admin18n, eina d'administraci坦 d'strings i18n
        ModelDesigner, GUI per generar el model.py


       TurboGears, framework de Python per aplicacions web        18
Treballant amb templates

  *.kid i els altres templates es poden obrir
  directament en un navegador!
  Per tant, poden ser editades pels dissenyadors
  web amb les seves aplicacions super-cool!
  Nom辿s s'ha d'anar amb compte de posar el
  text d'exemple
  <span py:replace="page.pagename">Text de la
  pgina</span>




        TurboGears, framework de Python per aplicacions web   19
L'aparen巽a tamb辿 compta (templates)

  Crear el template a partir de l'esquelet
  cp gplWiki20/templates/welcome.kid 
       gplWiki20/templates/page.kid

  Editar gplwiki20/templates/page.kid amb:
<title> ${page.pagename} - 20 Minute Wiki </title>
...
<div class="main_content">
 <div style="float:right; width: 10em">
    Viewing <span py:replace="page.pagename">Text de
    la pgina</span>
    <br/>
    You can return to the <a href="/">FrontPage</a>.
 </div>
 <div py:replace="XML(data)">Page text here.</div>
</div>




        TurboGears, framework de Python per aplicacions web   20
Per嘆 la pot竪ncia sense control no
serveix de res
  Escriurem el controlador: gplwiki20/controllers.py
import turbogears
from turbogears import controllers, expose
from gplwiki20.model import Page
from docutils.core import publish_parts

class Root(controllers.RootController):
    @expose(template="gplwiki20.templates.page")              #1
    def index(self , pagename="FrontPage"):                   #2
        page = Page.byPagename(pagename)                      #3
        content = publish_parts(page.data,
            writer_name="html")['html_body']                  #4
        return dict(data=content, page=page)                  #5

  Observeu que sense fer res s'ha recarregat el
  servidor web i els canvis ja seran visibles!



        TurboGears, framework de Python per aplicacions web        21
Per嘆 la pot竪ncia sense control no
serveix de res  Edici坦 de pgines
  Crear el template a partir del page.kid
  cp gplWiki20/templates/page.kid 
       gplWiki20/templates/edit.kid

  Editar gplwiki20/templates/edit.kid amb:
<title> Editant ${page.pagename} ... </title>
...
<div class="main_content">
...
 <form action="save" method="post">
    <input type="hidden" name="pagename"
       value="${page.pagename}"/>
    <textarea name="data" py:content="page.data"
       rows="10" cols="60"/>
    <input type="submit" name="submit" value="Save"/>
 </form>
 <!-- Eliminar <div py:replace="XML(data)">Text de la
    pgina.</div> -->
</div>
        TurboGears, framework de Python per aplicacions web   22
Per嘆 la pot竪ncia sense control no
serveix de res  Edici坦 de pgines II
  Crear el m竪tode d'acci坦 a controllers.py
    @expose("gplwiki20.templates.edit")
    def edit(self, pagename):
        page = Page.byPagename(pagename)
Tab!    return dict(page=page)

  Crear el m竪tode de guardar a controllers.py
   @expose()
   def save(self, pagename, data, submit):
       page = Page.byPagename(pagename)
       page.data = data
       turbogears.flash("Changes saved!")
       raise turbogears.redirect("/",pagename=pagename)

  Afegir l'enlla巽 a page.kid
<p>
  <a href="${tg.url('/edit',pagename=page.pagename)}">
Editar la pgina</a>
</p>
        TurboGears, framework de Python per aplicacions web   23
Per嘆 la pot竪ncia sense control no
serveix de res  Llistat de pgines
  Crear el template a partir del page.kid
  cp gplWiki20/templates/page.kid 
       gplWiki20/templates/pagelist.kid

  Editar gplwiki20/templates/pagelist.kid amb:
<title> Llistat </title>
...
<div class="main_content">
  <h1>Totes les pgines</h1>
  <ul>
    <li py:for="pagename in pages">
       <a href="${tg.url('/' + pagename)}"
         py:content="pagename">Nom de la pgina.</a>
    </li>
  </ul>
</div>




        TurboGears, framework de Python per aplicacions web   24
Per嘆 la pot竪ncia sense control no
serveix de res  Llistat de pgines II
   Crear el m竪tode d'acci坦 a controllers.py
     @expose("gplwiki20.templates.pagelist")
     def pagelist(self):
         pages = [page.pagename for page in
Tab!              Page.select(orderBy=Page.q.pagename)]
         return dict(pages=pages)

   Afegir l'enlla巽 a master.kid
...
<div id="footer">
...
<p>Veure la <a href="${tg.url('/pagelist')}">llista
completa de pgines.</a></p>
...




        TurboGears, framework de Python per aplicacions web   25
Les URLs entren pels ulls

   Actualment per accedir a les pgines:
         http://localhost:8080/?pagename=FrontPage
   No 辿s molt bonic no?? Potser millor
         http://localhost:8080/FrontPage
   Definim el m竪tode per defecte a controllers.py
     @expose()
     def default(self, pagename):
Tab!     return self.index(pagename)

   Al m竪tode save canviem
      raise turbogears.redirect("/", pagename=pagename)

   per
      raise turbogears.redirect("/%s" % pagename)


         TurboGears, framework de Python per aplicacions web   26
Creant les petjades dels camells

  Senzillament podem tenir sintaxis CamelCase, a
  trav辿s d'expressions regulars (al principi de
  controllers.py)
import re
wikiwords = re.compile(r"b([A-Z]w+[A-Z]+w+)")

  Modifiquem
    def index(self, pagename="FrontPage"):
        content = ...
        root = str(turbogears.url('/'))
        content = wikiwords.
           sub(r'<a href="%s1">1</a>'
           % root, content)
        return dict(data=content, page=page)




        TurboGears, framework de Python per aplicacions web   27
I si les coses no van b辿?

  Si la pgina no existeix, la crearem (controllers.py):
   @expose("gplwiki20.templates.edit")
   def notfound(self, pagename):
       page = Page(pagename=pagename, data="")
       return dict(page=page)

  Si la pgina no existeix, la crearem (controllers.py):
   @expose(template="gplwiki20.templates.page")
   def index(self, pagename="FrontPage"):
       try:
            page = Page.byPagename(pagename)
       except SQLObjectNotFound:
            raise turbogears.redirect("notfound"
                                , pagename = pagename)
   ...

  I un header per incloure l'excepci坦
    from sqlobject import SQLObjectNotFound

        TurboGears, framework de Python per aplicacions web   28
Necessitem ser oberts i comunicar-nos

  Podem generar informaci坦 a XML, JSON...
       @expose("gplwiki20.templates.pagelist")
       @expose("json")
       def pagelist(self):

  URL per format JSON:
  http://localhost:8080/pagelist?tg_format=json
  M辿s senzill impossible!




       TurboGears, framework de Python per aplicacions web   29
Necessitem ser fashions (AJAX+JavaScript)

  TurboGears utilitza Mochikit per JavaScript
  Afegir al fitxer gplwiki20/config/app.cfg
  tg.include_widgets = ['turbogears.mochikit']
         Reiniciar l'aplicaci坦!
  Afegir els ids on volem tenir AJAX, al master.kid
<div id="footer">
<p>Veure la <a id="pagelist"
    href="${tg.url('/pagelist')}">completa de
    pgines.</a></p>
<div id="pagelist_results"></div>
...




         TurboGears, framework de Python per aplicacions web   30
Necessitem ser fashions (AJAX+JavaScript)
   Script JavaScript per reconstruir la llista de pgines,
   al fitxer master.kid:
...
</style>
<script type="text/javascript">
addLoadEvent(function(){
    connect($('pagelist'),'onclick', function (e) {
    e.preventDefault();
    var d = loadJSONDoc("${tg.url('/pagelist', tg_format='json')}");
    d.addCallback(showPageList); });});

function showPageList(result) {
    var currentpagelist = UL(null, map(row_display,result["pages"]));
    replaceChildNodes("pagelist_results", currentpagelist);}

function row_display(pagename) {
    return LI(null, A({"href" : "${tg.url('/')}" +pagename},
                                                        pagename))}
</script>




          TurboGears, framework de Python per aplicacions web     31
Beneficis de TurboGears

  Desenvolupament local
        No s'ha de pujar l'aplicaci坦 a cap servidor
  Temps entre proves m鱈nim!
        No s'ha de compilar res
        CherryPy est叩 pendent dels canvis dels fitxers i
        automticament recarrega el servidor quan els fitxers
        font han canviat
  Consultes i actualitzacions a la BD senzilles
        No es necessari escriure SQL
        Per嘆 es poden escriure, si 辿s necessari
  Els templates s坦n visualitzables al navegador
        Evita la programaci坦 a cegues
  Ahh!! I els widgets! http://localhost:7654/widgets/
        TurboGears, framework de Python per aplicacions web     32
Exemples d'aplicacions TurboGears

  Pyndorama - http://code.google.com/p/pyndorama/
  WhatWhat Status -
   http://code.google.com/p/whatwhat-status/
  VotingPlace.net - http://votingplace.net/
  Doggdot - http://doggdot.us/
  Showmedo - http://showmedo.com/
  GeneSilico - http://genesilico.pl/toolkit/
  PairWise Neighbours -
    http://genomes.urv.cat/pwneigh/




        TurboGears, framework de Python per aplicacions web   33
Agra誰ments

 Comunitat TurboGears
 Presentaci坦 basada en:
       Documentaci坦 TurboGears
       Documentaci坦 d'Stefano Zacchiroli i Christopher Arndt
 GPLTarragona




       TurboGears, framework de Python per aplicacions web     34
Moltes grcies per la
  vostra atenci坦!!

More Related Content

Viewers also liked (7)

Teks pengacara majlis mesy agung ke 40
Teks pengacara majlis mesy agung ke 40Teks pengacara majlis mesy agung ke 40
Teks pengacara majlis mesy agung ke 40
mazidah binti ali
Liquid Crystal Colloids - CFTC Seminar 2010
Liquid Crystal Colloids - CFTC Seminar 2010Liquid Crystal Colloids - CFTC Seminar 2010
Liquid Crystal Colloids - CFTC Seminar 2010
NunoSilvestre
Plan strategik pemulihan 2012
Plan strategik pemulihan 2012Plan strategik pemulihan 2012
Plan strategik pemulihan 2012
mazidah binti ali
Primary View Point Interactive
Primary View Point InteractivePrimary View Point Interactive
Primary View Point Interactive
richardager
Rumus ukuran panjang......
Rumus ukuran panjang......Rumus ukuran panjang......
Rumus ukuran panjang......
mazidah binti ali
Borang kemaskini maklumat murid
Borang kemaskini maklumat muridBorang kemaskini maklumat murid
Borang kemaskini maklumat murid
mazidah binti ali
Html
HtmlHtml
Html
Inderpreet Singh
Teks pengacara majlis mesy agung ke 40
Teks pengacara majlis mesy agung ke 40Teks pengacara majlis mesy agung ke 40
Teks pengacara majlis mesy agung ke 40
mazidah binti ali
Liquid Crystal Colloids - CFTC Seminar 2010
Liquid Crystal Colloids - CFTC Seminar 2010Liquid Crystal Colloids - CFTC Seminar 2010
Liquid Crystal Colloids - CFTC Seminar 2010
NunoSilvestre
Plan strategik pemulihan 2012
Plan strategik pemulihan 2012Plan strategik pemulihan 2012
Plan strategik pemulihan 2012
mazidah binti ali
Primary View Point Interactive
Primary View Point InteractivePrimary View Point Interactive
Primary View Point Interactive
richardager
Rumus ukuran panjang......
Rumus ukuran panjang......Rumus ukuran panjang......
Rumus ukuran panjang......
mazidah binti ali
Borang kemaskini maklumat murid
Borang kemaskini maklumat muridBorang kemaskini maklumat murid
Borang kemaskini maklumat murid
mazidah binti ali

Similar to Turbo Gears, Framework De Python Per Aplicacions Web (20)

El framework Cakephp
El framework CakephpEl framework Cakephp
El framework Cakephp
herotyc
Dai 9 - Ruby on Rails
Dai 9 - Ruby on RailsDai 9 - Ruby on Rails
Dai 9 - Ruby on Rails
Carles Mateu
Desmitificant l'HTML5
Desmitificant l'HTML5Desmitificant l'HTML5
Desmitificant l'HTML5
Ymbra
Presentacio Django
Presentacio DjangoPresentacio Django
Presentacio Django
Antoni Aloy
Resum
ResumResum
Resum
cfgmi
Dai 09-ruby on rails
Dai 09-ruby on railsDai 09-ruby on rails
Dai 09-ruby on rails
Carles Mateu
Itineraris IT Academy (2020)
Itineraris IT Academy (2020)Itineraris IT Academy (2020)
Itineraris IT Academy (2020)
Barcelona Activa
Cas dus de Framework web desenvolupat amb llibreries Lliures
Cas dus de Framework web desenvolupat amb llibreries LliuresCas dus de Framework web desenvolupat amb llibreries Lliures
Cas dus de Framework web desenvolupat amb llibreries Lliures
Jordi Cat
J2EE
J2EEJ2EE
J2EE
Albert Coronado
Programaci坦 Web - PAC 2 correcci坦 - Multim竪dia (UOC) - Paquita Ribas
Programaci坦  Web - PAC 2 correcci坦 - Multim竪dia (UOC) - Paquita RibasProgramaci坦  Web - PAC 2 correcci坦 - Multim竪dia (UOC) - Paquita Ribas
Programaci坦 Web - PAC 2 correcci坦 - Multim竪dia (UOC) - Paquita Ribas
Paquita Ribas
e-Knowledge
e-Knowledgee-Knowledge
e-Knowledge
Javier Otero
Display suite - Drupal.cat
Display suite - Drupal.catDisplay suite - Drupal.cat
Display suite - Drupal.cat
Atenea tech
Presentaci坦 de Magento
Presentaci坦 de MagentoPresentaci坦 de Magento
Presentaci坦 de Magento
Roger Casadej炭s P辿rez
Framework Llibreries Lliures
Framework Llibreries LliuresFramework Llibreries Lliures
Framework Llibreries Lliures
Jordi Cat
ELISAVA Beta. Cas d'竪xit desenvolupat per Ymbra
ELISAVA Beta. Cas d'竪xit desenvolupat per YmbraELISAVA Beta. Cas d'竪xit desenvolupat per Ymbra
ELISAVA Beta. Cas d'竪xit desenvolupat per Ymbra
Ymbra
Presentaci坦 del servidor Apache
Presentaci坦 del servidor ApachePresentaci坦 del servidor Apache
Presentaci坦 del servidor Apache
Roger Casadej炭s P辿rez
SIGT09 Introducci坦 Joomla
SIGT09 Introducci坦 JoomlaSIGT09 Introducci坦 Joomla
SIGT09 Introducci坦 Joomla
Alex Araujo
somUPC: Integraci坦 de les intranets de la UPC
somUPC: Integraci坦 de les intranets de la UPCsomUPC: Integraci坦 de les intranets de la UPC
somUPC: Integraci坦 de les intranets de la UPC
inLabFIB
Introducci坦 a Drupal - CINC Girona
Introducci坦 a Drupal - CINC GironaIntroducci坦 a Drupal - CINC Girona
Introducci坦 a Drupal - CINC Girona
talkomraja
El framework Cakephp
El framework CakephpEl framework Cakephp
El framework Cakephp
herotyc
Dai 9 - Ruby on Rails
Dai 9 - Ruby on RailsDai 9 - Ruby on Rails
Dai 9 - Ruby on Rails
Carles Mateu
Desmitificant l'HTML5
Desmitificant l'HTML5Desmitificant l'HTML5
Desmitificant l'HTML5
Ymbra
Presentacio Django
Presentacio DjangoPresentacio Django
Presentacio Django
Antoni Aloy
Resum
ResumResum
Resum
cfgmi
Dai 09-ruby on rails
Dai 09-ruby on railsDai 09-ruby on rails
Dai 09-ruby on rails
Carles Mateu
Itineraris IT Academy (2020)
Itineraris IT Academy (2020)Itineraris IT Academy (2020)
Itineraris IT Academy (2020)
Barcelona Activa
Cas dus de Framework web desenvolupat amb llibreries Lliures
Cas dus de Framework web desenvolupat amb llibreries LliuresCas dus de Framework web desenvolupat amb llibreries Lliures
Cas dus de Framework web desenvolupat amb llibreries Lliures
Jordi Cat
Programaci坦 Web - PAC 2 correcci坦 - Multim竪dia (UOC) - Paquita Ribas
Programaci坦  Web - PAC 2 correcci坦 - Multim竪dia (UOC) - Paquita RibasProgramaci坦  Web - PAC 2 correcci坦 - Multim竪dia (UOC) - Paquita Ribas
Programaci坦 Web - PAC 2 correcci坦 - Multim竪dia (UOC) - Paquita Ribas
Paquita Ribas
Display suite - Drupal.cat
Display suite - Drupal.catDisplay suite - Drupal.cat
Display suite - Drupal.cat
Atenea tech
Framework Llibreries Lliures
Framework Llibreries LliuresFramework Llibreries Lliures
Framework Llibreries Lliures
Jordi Cat
ELISAVA Beta. Cas d'竪xit desenvolupat per Ymbra
ELISAVA Beta. Cas d'竪xit desenvolupat per YmbraELISAVA Beta. Cas d'竪xit desenvolupat per Ymbra
ELISAVA Beta. Cas d'竪xit desenvolupat per Ymbra
Ymbra
SIGT09 Introducci坦 Joomla
SIGT09 Introducci坦 JoomlaSIGT09 Introducci坦 Joomla
SIGT09 Introducci坦 Joomla
Alex Araujo
somUPC: Integraci坦 de les intranets de la UPC
somUPC: Integraci坦 de les intranets de la UPCsomUPC: Integraci坦 de les intranets de la UPC
somUPC: Integraci坦 de les intranets de la UPC
inLabFIB
Introducci坦 a Drupal - CINC Girona
Introducci坦 a Drupal - CINC GironaIntroducci坦 a Drupal - CINC Girona
Introducci坦 a Drupal - CINC Girona
talkomraja

Turbo Gears, Framework De Python Per Aplicacions Web

  • 1. TurboGears, framework de Python per aplicacions web I Jornades GPL Tarragona 29 de Gener de 2009 Toms Reverter Morell坦 tomas.reverter@lotomas.net http://lotomas.net
  • 2. Llic竪ncia Creative Commons BY-SA Reconeixement-Compartir amb la mateixa llic竪ncia 3.0 Espanya Sou lliure de: copiar, distribuir i comunicar p炭blicament l'obra fer-ne obres derivades Amb les condicions seg端ents: Reconeixement. Heu de recon竪ixer els cr竪dits de l'obra de la manera especificada per l'autor o el llicenciador (per嘆 no d'una manera que suggereixi que us donen suport o rebeu suport per l'炭s que feu l'obra). Compartir amb la mateixa llic竪ncia. Si altereu o transformeu aquesta obra, o en genereu obres derivades, nom辿s podeu distribuir l'obra resultant amb la mateixa llic竪ncia, una de similar o una de compatible. Quan reutilitzeu o distribu誰u l'obra, heu de deixar ben clar els termes de la llic竪ncia de l'obra. Alguna de les condicions pot no aplicar-se si obteniu el perm鱈s del titular dels drets d'autor. No hi ha res en aquesta llic竪ncia que menyscabi o restringeixi els drets morals de l'autor. http://creativecommons.org/licenses/by-sa/3.0/es/deed.ca TurboGears, framework de Python per aplicacions web 2
  • 3. Taula de contingut 1. Qu竪 辿s TurboGears? I un framework? 2. Components, components i m辿s components 3. Model-Vista-Control i l'estructura de TurboGears 4. Hands-on-lab: com crear un wiki en 20 minuts 5. Exemples d'aplicacions amb TurboGears 6. Conclusions TurboGears, framework de Python per aplicacions web 3
  • 4. Qu竪 辿s TurboGears? TurboGears 辿s un framework web basat en Python, un mega-framework Comparable a Ruby On Rails i CakePHP Permet construir aplicacions web orientades a bases de dades Constru誰t amb arquitectura MVC Codi obert (llic竪ncia MIT, compatible GPL) Multiplataforma Projecte amb gaireb辿 5 anys de vida Versi坦 estable 1.0.8 Versi坦 2.0 en beta 4 TurboGears, framework de Python per aplicacions web 4
  • 5. I un framework? I un framework? A software framework is an abstraction in which common code providing generic functionality can be selectively overridden or specialized by user code providing specific functionality. ... the overall program's flow of control is not dictated by the caller, but by the framework. This inversion of control is the distinguishing feature of software frameworks. [Wikipedia] Un framework 辿s una pe巽a de programari sobre el que pugem els desenvolupadors per aprofitar funcionalitats comuns pugem = Inversion of Control! No hem de reinventar la roda! A la prctica = un esquelet en que basar-te TurboGears, framework de Python per aplicacions web 5
  • 6. Model-Vista-Control (MVC) El MVC 辿s un patr坦 arquitect嘆nic de l'enginyeria del programari Busca la separaci坦 de components per simplificar les aplicacions Independitza la presentaci坦 de les dades Parts: Model: s'encarrega de la persist竪ncia, la base de dades Vista: la UI del client, la capa de presentaci坦 Control: la l嘆gica del servidor TurboGears, framework de Python per aplicacions web 6
  • 7. Flux del Model-Vista-Control (MVC) L'usuari interactua amb la interf鱈cie grfica dissenyada a la vista El control manega l'entrada de l'usuari, redirigint la petici坦 a una pe巽a de codi m辿s espec鱈fica El control actualitza la informaci坦 del model La vista utilitza el model per generar la nova interf鱈cie d'usuari La interf鱈cie resta a l'espera de l'acci坦 de l'usuari TurboGears, framework de Python per aplicacions web 7
  • 8. Components, components i components Client-side JavaScript Mochikit Template engine Kid Servidor d'aplicacions CherryPy Abstracci坦 base de dades (ORM) SQLObject I molts m辿s... FormEncode, Nose, simplejson, SQLAlchemy, Genshi, Identity Management... TurboGears, framework de Python per aplicacions web 8
  • 9. Model-Vista-Control (MVC) i l'estructura de TurboGears Filosofia Jack el Destripador: anem per parts En cada component es poden utilitzar diverses solucions TurboGears, framework de Python per aplicacions web 9
  • 10. Model-Vista-Control (MVC) i l'estructura de TurboGears Filosofia Jack el Destripador: anem per parts En cada component es poden utilitzar diverses solucions TurboGears, framework de Python per aplicacions web 10
  • 11. Hands-on-lab: un wiki en 20 minuts Demostraci坦 prctica del funcionament de TurboGears Desenvoluparem una aplicaci坦 web que ens doni la funcionalitat de wiki: Guardar informaci坦 per paraules Fcil edici坦 de continguts Reconeixement de sintaxis CamelCase (per enlla巽os) URLs boniques Sortida en XML/JSON Ginys a la interf鱈cie en AJAX TurboGears, framework de Python per aplicacions web 11
  • 12. Hands-on-lab: requeriments Els requeriments per realitzar aquesta demo s坦n: TurboGears 1.0.x GNU/Linux, MacOSX o Windows Python >= 2.3.x, <= 2.5.x (no 2.6 ni 3k) Connexi坦 a internet (easy_install) Base de dades (MySQL, SQLite, PostgreSQL...) Opcionalment, un IDE per Python Eclipse EasyEclipse for Python VIM TurboGears, framework de Python per aplicacions web 12
  • 13. Hands-on-lab: passos que seguirem 1. Crear l'esquelet de l'aplicaci坦 (quickstart) 2. Definir el model de dades Crear la base de dades Escriure dades de mostra 3. Escriure les plantilles de la vista 4. Escriure el controlador en Python 5. Rubricar amb JSON i AJAX TurboGears, framework de Python per aplicacions web 13
  • 14. QuickStart: obrint el past鱈s Crear un esquelet de projecte des de zero $ tg-admin quickstart Enter project name: gplWiki20 Enter package name [wiki20]: gplWiki20 Do you need Identity (usernames/passwords) in this project? [no] no ...output... cd gplWiki20 Amb aix嘆 ja tenim un esquelet d'aplicaci坦 web totalment funcional TurboGears, framework de Python per aplicacions web 14
  • 15. I no fa falta servidor web? Als requeriments, no hi ha servidor web!!! CherryPy ja est integrat amb TurboGears Per arrancar l'aplicaci坦: cd gplWiki20 python start-gplwiki20.py Punt d'entrada -> http://localhost:8080 Tant senzill com aix嘆! TurboGears, framework de Python per aplicacions web 15
  • 16. Llei del m鱈nim esfor巽: definint el model via ORM Model centralitzat en un fitxer: gplwiki20/model.py Definim la entitat Page: class Page(SQLObject): pagename = UnicodeCol(alternateID=True,length=30) data = UnicodeCol() Amb aquesta definici坦 d'SQLObject en tenim prou (Vigilar amb els tabuladors, que formen part de la sintaxi del Python!) TurboGears, framework de Python per aplicacions web 16
  • 17. Creaci坦 de les taules a la base de dades Primer hem de configurar la base de dades Dos fitxers de configuraci坦 espec鱈fics, desenvolupament (dev.cfg) i per producci坦 (prod.cfg) Fitxer dev.cfg sqlobject.dburi="mysql://us:pwd@localhost/gplWiki20" Crear la base de dades en si echo "create database gplWiki20" | mysql -u root Sou SQL-desconfiats? Anem a veure que executar: tg-admin sql sql Ara, a crear taules en una comanda: tg-admin sql create TurboGears, framework de Python per aplicacions web 17
  • 18. Utilizant dummies pels crash-tests La informaci坦 per proves es pot entrar fcilment des de la toolboox de TurboGears tg-admin toolbox Ens portar a http://localhost:7654/ Anar a CatWalk Clic a Page Add Page amb el nom FrontPage El toolbox pot ajudar per moltes m辿s coses: Informaci坦 de TurboGears (paquets, versions...) WidgetBrowser, veure les capacitats dels widgets (!!!!) admin18n, eina d'administraci坦 d'strings i18n ModelDesigner, GUI per generar el model.py TurboGears, framework de Python per aplicacions web 18
  • 19. Treballant amb templates *.kid i els altres templates es poden obrir directament en un navegador! Per tant, poden ser editades pels dissenyadors web amb les seves aplicacions super-cool! Nom辿s s'ha d'anar amb compte de posar el text d'exemple <span py:replace="page.pagename">Text de la pgina</span> TurboGears, framework de Python per aplicacions web 19
  • 20. L'aparen巽a tamb辿 compta (templates) Crear el template a partir de l'esquelet cp gplWiki20/templates/welcome.kid gplWiki20/templates/page.kid Editar gplwiki20/templates/page.kid amb: <title> ${page.pagename} - 20 Minute Wiki </title> ... <div class="main_content"> <div style="float:right; width: 10em"> Viewing <span py:replace="page.pagename">Text de la pgina</span> <br/> You can return to the <a href="/">FrontPage</a>. </div> <div py:replace="XML(data)">Page text here.</div> </div> TurboGears, framework de Python per aplicacions web 20
  • 21. Per嘆 la pot竪ncia sense control no serveix de res Escriurem el controlador: gplwiki20/controllers.py import turbogears from turbogears import controllers, expose from gplwiki20.model import Page from docutils.core import publish_parts class Root(controllers.RootController): @expose(template="gplwiki20.templates.page") #1 def index(self , pagename="FrontPage"): #2 page = Page.byPagename(pagename) #3 content = publish_parts(page.data, writer_name="html")['html_body'] #4 return dict(data=content, page=page) #5 Observeu que sense fer res s'ha recarregat el servidor web i els canvis ja seran visibles! TurboGears, framework de Python per aplicacions web 21
  • 22. Per嘆 la pot竪ncia sense control no serveix de res Edici坦 de pgines Crear el template a partir del page.kid cp gplWiki20/templates/page.kid gplWiki20/templates/edit.kid Editar gplwiki20/templates/edit.kid amb: <title> Editant ${page.pagename} ... </title> ... <div class="main_content"> ... <form action="save" method="post"> <input type="hidden" name="pagename" value="${page.pagename}"/> <textarea name="data" py:content="page.data" rows="10" cols="60"/> <input type="submit" name="submit" value="Save"/> </form> <!-- Eliminar <div py:replace="XML(data)">Text de la pgina.</div> --> </div> TurboGears, framework de Python per aplicacions web 22
  • 23. Per嘆 la pot竪ncia sense control no serveix de res Edici坦 de pgines II Crear el m竪tode d'acci坦 a controllers.py @expose("gplwiki20.templates.edit") def edit(self, pagename): page = Page.byPagename(pagename) Tab! return dict(page=page) Crear el m竪tode de guardar a controllers.py @expose() def save(self, pagename, data, submit): page = Page.byPagename(pagename) page.data = data turbogears.flash("Changes saved!") raise turbogears.redirect("/",pagename=pagename) Afegir l'enlla巽 a page.kid <p> <a href="${tg.url('/edit',pagename=page.pagename)}"> Editar la pgina</a> </p> TurboGears, framework de Python per aplicacions web 23
  • 24. Per嘆 la pot竪ncia sense control no serveix de res Llistat de pgines Crear el template a partir del page.kid cp gplWiki20/templates/page.kid gplWiki20/templates/pagelist.kid Editar gplwiki20/templates/pagelist.kid amb: <title> Llistat </title> ... <div class="main_content"> <h1>Totes les pgines</h1> <ul> <li py:for="pagename in pages"> <a href="${tg.url('/' + pagename)}" py:content="pagename">Nom de la pgina.</a> </li> </ul> </div> TurboGears, framework de Python per aplicacions web 24
  • 25. Per嘆 la pot竪ncia sense control no serveix de res Llistat de pgines II Crear el m竪tode d'acci坦 a controllers.py @expose("gplwiki20.templates.pagelist") def pagelist(self): pages = [page.pagename for page in Tab! Page.select(orderBy=Page.q.pagename)] return dict(pages=pages) Afegir l'enlla巽 a master.kid ... <div id="footer"> ... <p>Veure la <a href="${tg.url('/pagelist')}">llista completa de pgines.</a></p> ... TurboGears, framework de Python per aplicacions web 25
  • 26. Les URLs entren pels ulls Actualment per accedir a les pgines: http://localhost:8080/?pagename=FrontPage No 辿s molt bonic no?? Potser millor http://localhost:8080/FrontPage Definim el m竪tode per defecte a controllers.py @expose() def default(self, pagename): Tab! return self.index(pagename) Al m竪tode save canviem raise turbogears.redirect("/", pagename=pagename) per raise turbogears.redirect("/%s" % pagename) TurboGears, framework de Python per aplicacions web 26
  • 27. Creant les petjades dels camells Senzillament podem tenir sintaxis CamelCase, a trav辿s d'expressions regulars (al principi de controllers.py) import re wikiwords = re.compile(r"b([A-Z]w+[A-Z]+w+)") Modifiquem def index(self, pagename="FrontPage"): content = ... root = str(turbogears.url('/')) content = wikiwords. sub(r'<a href="%s1">1</a>' % root, content) return dict(data=content, page=page) TurboGears, framework de Python per aplicacions web 27
  • 28. I si les coses no van b辿? Si la pgina no existeix, la crearem (controllers.py): @expose("gplwiki20.templates.edit") def notfound(self, pagename): page = Page(pagename=pagename, data="") return dict(page=page) Si la pgina no existeix, la crearem (controllers.py): @expose(template="gplwiki20.templates.page") def index(self, pagename="FrontPage"): try: page = Page.byPagename(pagename) except SQLObjectNotFound: raise turbogears.redirect("notfound" , pagename = pagename) ... I un header per incloure l'excepci坦 from sqlobject import SQLObjectNotFound TurboGears, framework de Python per aplicacions web 28
  • 29. Necessitem ser oberts i comunicar-nos Podem generar informaci坦 a XML, JSON... @expose("gplwiki20.templates.pagelist") @expose("json") def pagelist(self): URL per format JSON: http://localhost:8080/pagelist?tg_format=json M辿s senzill impossible! TurboGears, framework de Python per aplicacions web 29
  • 30. Necessitem ser fashions (AJAX+JavaScript) TurboGears utilitza Mochikit per JavaScript Afegir al fitxer gplwiki20/config/app.cfg tg.include_widgets = ['turbogears.mochikit'] Reiniciar l'aplicaci坦! Afegir els ids on volem tenir AJAX, al master.kid <div id="footer"> <p>Veure la <a id="pagelist" href="${tg.url('/pagelist')}">completa de pgines.</a></p> <div id="pagelist_results"></div> ... TurboGears, framework de Python per aplicacions web 30
  • 31. Necessitem ser fashions (AJAX+JavaScript) Script JavaScript per reconstruir la llista de pgines, al fitxer master.kid: ... </style> <script type="text/javascript"> addLoadEvent(function(){ connect($('pagelist'),'onclick', function (e) { e.preventDefault(); var d = loadJSONDoc("${tg.url('/pagelist', tg_format='json')}"); d.addCallback(showPageList); });}); function showPageList(result) { var currentpagelist = UL(null, map(row_display,result["pages"])); replaceChildNodes("pagelist_results", currentpagelist);} function row_display(pagename) { return LI(null, A({"href" : "${tg.url('/')}" +pagename}, pagename))} </script> TurboGears, framework de Python per aplicacions web 31
  • 32. Beneficis de TurboGears Desenvolupament local No s'ha de pujar l'aplicaci坦 a cap servidor Temps entre proves m鱈nim! No s'ha de compilar res CherryPy est叩 pendent dels canvis dels fitxers i automticament recarrega el servidor quan els fitxers font han canviat Consultes i actualitzacions a la BD senzilles No es necessari escriure SQL Per嘆 es poden escriure, si 辿s necessari Els templates s坦n visualitzables al navegador Evita la programaci坦 a cegues Ahh!! I els widgets! http://localhost:7654/widgets/ TurboGears, framework de Python per aplicacions web 32
  • 33. Exemples d'aplicacions TurboGears Pyndorama - http://code.google.com/p/pyndorama/ WhatWhat Status - http://code.google.com/p/whatwhat-status/ VotingPlace.net - http://votingplace.net/ Doggdot - http://doggdot.us/ Showmedo - http://showmedo.com/ GeneSilico - http://genesilico.pl/toolkit/ PairWise Neighbours - http://genomes.urv.cat/pwneigh/ TurboGears, framework de Python per aplicacions web 33
  • 34. Agra誰ments Comunitat TurboGears Presentaci坦 basada en: Documentaci坦 TurboGears Documentaci坦 d'Stefano Zacchiroli i Christopher Arndt GPLTarragona TurboGears, framework de Python per aplicacions web 34
  • 35. Moltes grcies per la vostra atenci坦!!