Diferència entre revisions de la pàgina «Pyramid: arquitectura»

De Cacauet Wiki
Salta a la navegació Salta a la cerca
(Es crea la pàgina amb «Aquest és un article que detalla l'original Python: Pyramid framework. Abans de treballar aquest apartat, cal que us familiaritzeu amb aquest framework (mireu el li…».)
 
 
(Hi ha 8 revisions intermèdies del mateix usuari que no es mostren)
Línia 3: Línia 3:
 
Abans de treballar aquest apartat, cal que us familiaritzeu amb aquest framework (mireu el link anterior).
 
Abans de treballar aquest apartat, cal que us familiaritzeu amb aquest framework (mireu el link anterior).
  
 +
Pyramid utilitza l'arquitectura [http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller model-vista-controlador].
 +
 +
== Aïllament del codi i el disseny ==
 +
<div class="exercici">Una de les idees més importants en Pyramid (i en la majordia de ''frameworks'') és facilitar la creació i el manteniment dels projectes. Per aquesta raó '''es sol buscar l'aïllament entre el <u>codi</u> (contingut, dades manipulades amb Python) i el <u>disseny</u> (forma, HTML)'''. En Pyramid això es realitza mitjançant la utilització de les views (codi de la pàgina) que es renderitzen en les plantilles (.pt o .mako).</div>
 +
 +
Tal com diem, ens convé separar netament:
 +
* '''Codi''': dades, manipulació amb un llenguatge de programació. '''Arixu views.py'''
 +
* '''Disseny''': aparença de la web (HTML, CSS). Carpeta templates: '''arxius .pt o .mako'''
 +
 +
 +
== Arxius d'un projecte Pyramid ==
 
L'arquitectura bàsica d'una ''site'' Pyramid , just quan creem el ''scaffold'' bàsic és (en negreta les que ens interessen):
 
L'arquitectura bàsica d'una ''site'' Pyramid , just quan creem el ''scaffold'' bàsic és (en negreta les que ens interessen):
 
  '''simpleshop/'''
 
  '''simpleshop/'''
 
  ├── CHANGES.txt
 
  ├── CHANGES.txt
  ├── '''development.ini'''
+
  ├── '''development.ini'''       # arxiu de conf. de l'entorn (port d'escolta, etc.)
 
  ├── MANIFEST.in
 
  ├── MANIFEST.in
 
  ├── '''production.ini'''
 
  ├── '''production.ini'''
Línia 12: Línia 23:
 
  ├── setup.cfg
 
  ├── setup.cfg
 
  ├── setup.py
 
  ├── setup.py
  └── '''simpleshop'''
+
  └── '''simpleshop'''           # arxiu de conf. de l'entorn (port d'escolta, etc.)
     ├── '''__init__.py'''
+
     ├── '''__init__.py'''      # arxiu '''__INIT__'''
 
     ├── static
 
     ├── static
 
     │   ├── favicon.ico
 
     │   ├── favicon.ico
Línia 20: Línia 31:
 
     │   ├── ie6.css
 
     │   ├── ie6.css
 
     │   ├── middlebg.png
 
     │   ├── middlebg.png
     │   ├── pylons.css
+
     │   ├── '''pylons.css'''    # CSS (full d'estils)
 
     │   ├── pyramid.png
 
     │   ├── pyramid.png
 
     │   ├── pyramid-small.png
 
     │   ├── pyramid-small.png
 
     │   └── transparent.gif
 
     │   └── transparent.gif
 
     ├── '''templates'''
 
     ├── '''templates'''
     │   └── '''mytemplate.pt'''
+
     │   └── '''mytemplate.pt''' # template principal
 
     ├── tests.py
 
     ├── tests.py
     └── '''views.py'''
+
     └── '''views.py'''         # arxiu '''VIEWS'''
 +
 
 +
 
 +
== Parts bàsiques del projecte ==
 +
* __init__.py : codi d'arrencada. Hi trobarem:
 +
** Configuració general de l'aplicació
 +
** Conf. directori ''static''
 +
** Configuració de les rutes: traducció de les URLs -> funcions (views).
 +
* views.py
 +
** Codi de les views (el què s'executarà abans de renderitzar la plantilla).
 +
* templates (carpeta) : plantilles (documents model per ser renderitzats).
 +
** '''MAKO templates''' (arxius .MAKO) : http://www.makotemplates.org . Són els més simples i propers al llenguatge Python i el que utilitzarem per defecte.
 +
** '''ZOPE Page Templates''' (arxius .PT) : Són més complexes però afegeixen més funcionalitat com internacionalització (sistema de traducció), etc.
 +
*** http://docs.zope.org/zope2/zope2book/ZPT.html
 +
*** http://zpt.sourceforge.net/
 +
** ... hi ha un gran nombre de sistemes de plantilles.
 +
<br>
 +
 
 +
== Per crear una nova pàgina ==
 +
# Crear una nova view en views.py
 +
#* Tenir cura de no sobreescriure el nom de la funció de la view.
 +
# Afegir la ruta (URL) que ens portarà a la view:
 +
#* A l'arxiu __init__.py
 +
# Crear la plantilla (template) que renderitzarà la view.
 +
#* Crear un nou arxiu .mako a la carpeta "templates".
 +
#* La plantilla ha d'estar "lligada" a la view (pel paràmetre "renderer" del ''decorator'').
 +
<br>
 +
 
 +
=== 1.View ===
 +
Mostrarem un petit exemple de com es passen la informació entre el codi (view) i la plantilla.
 +
 
 +
A la view generarem les dades a partir d'arxius o de bases de dades. Quan acabem de processar-ho '''retornarem les dades a la plantilla en forma de diccionari'''.
 +
 
 +
En el següent exemple retornarem 3 variables dins del diccionari:
 +
* nom del projecte
 +
* llista de productes
 +
* diccionari de productes i preus
 +
 
 +
<syntaxhighlight lang="Python">
 +
@view_config(route_name='productes', renderer='productes.mako')
 +
def productes_view(request):
 +
  # aqui aniriem als arxius o la base de dades a buscar la informació
 +
  # així ho simulem
 +
  proj = "Botigueta Pro"
 +
  prod = [ 'pepino' , 'enciam' , 'plàtan' ]
 +
  preus = { 'pepino':'2€/kg', 'enciam':'1€/peça', 'plàtan':'2.5€/kg' }
 +
  # els retornarem amb:
 +
  return { "projecte":proj, "productes":prod, "preus":preus }
 +
</syntaxhighlight>
 +
 
 +
=== 2.Ruta a __init__.py ===
 +
Això és necessari per que la request de la URL que demana el client es redirigeixi cap a la ''view''.
 +
<syntaxhighlight lang="Python">
 +
config.add_route('productes', '/botiga') # productes=view, /botiga=URL
 +
</syntaxhighlight>
 +
 
 +
=== 3.Plantilla (template .mako o .pt) ===
 +
Ara podrem utilitzar les variables retornades a la ''view'' a la plantilla '''productes.mako''' (la que s'indica al "renderer" de la view). En la plantilla (template) treballarem amb HTML, i, per exemple, per visualitzar el nom del projecte posaríem:
 +
${projecte}
 +
...i amb la llista i el diccionari tres quarts del mateix:
 +
<syntaxhighlight lang="html4strict">
 +
<html>
 +
  <body>
 +
      <h1>${projecte}</h1>
 +
      <ul>
 +
      % for prod in productes:
 +
        <li>${prod}</li>
 +
      % endfor
 +
      </ul><br>
 +
      El preu de l'enciam és: ${preus['enciam']}
 +
  </body>
 +
</html>
 +
</syntaxhighlight>
 +
 
 +
=== Alguns ajustos més perquè funcioni ===
 +
Per problemes de la codificació per defecte (unicode) cal canviar-la a "utf-8" tant als arxius com en el sistema:
 +
 
 +
Editar '''/usr/lib/pythonX.Y/sitecustomize.py''' i afegir:
 +
<syntaxhighlight lang="python">
 +
import sys
 +
sys.setdefaultencoding('utf-8')
 +
</syntaxhighlight>
 +
 
 +
Afegir la codificació al principi dels arxius:
 +
# -*- coding: utf-8 -*-
 +
 
 +
Finalment cal afegir el path dels templates MAKO al main() del __init__.py:
 +
<syntaxhighlight lang="python">
 +
import os
 +
here = os.path.dirname(os.path.abspath(__file__))
 +
settings['mako.directories'] = os.path.join(here, 'templates')
 +
</syntaxhighlight>

Revisió de 19:14, 12 des 2012

Aquest és un article que detalla l'original Python: Pyramid framework.

Abans de treballar aquest apartat, cal que us familiaritzeu amb aquest framework (mireu el link anterior).

Pyramid utilitza l'arquitectura model-vista-controlador.

Aïllament del codi i el disseny[modifica]

Una de les idees més importants en Pyramid (i en la majordia de frameworks) és facilitar la creació i el manteniment dels projectes. Per aquesta raó es sol buscar l'aïllament entre el codi (contingut, dades manipulades amb Python) i el disseny (forma, HTML). En Pyramid això es realitza mitjançant la utilització de les views (codi de la pàgina) que es renderitzen en les plantilles (.pt o .mako).

Tal com diem, ens convé separar netament:

  • Codi: dades, manipulació amb un llenguatge de programació. Arixu views.py
  • Disseny: aparença de la web (HTML, CSS). Carpeta templates: arxius .pt o .mako


Arxius d'un projecte Pyramid[modifica]

L'arquitectura bàsica d'una site Pyramid , just quan creem el scaffold bàsic és (en negreta les que ens interessen):

simpleshop/
├── CHANGES.txt
├── development.ini       # arxiu de conf. de l'entorn (port d'escolta, etc.)
├── MANIFEST.in
├── production.ini
├── README.txt
├── setup.cfg
├── setup.py
└── simpleshop            # arxiu de conf. de l'entorn (port d'escolta, etc.)
    ├── __init__.py       # arxiu __INIT__
    ├── static
    │   ├── favicon.ico
    │   ├── footerbg.png
    │   ├── headerbg.png
    │   ├── ie6.css
    │   ├── middlebg.png
    │   ├── pylons.css    # CSS (full d'estils)
    │   ├── pyramid.png
    │   ├── pyramid-small.png
    │   └── transparent.gif
    ├── templates
    │   └── mytemplate.pt # template principal
    ├── tests.py
    └── views.py          # arxiu VIEWS


Parts bàsiques del projecte[modifica]

  • __init__.py : codi d'arrencada. Hi trobarem:
    • Configuració general de l'aplicació
    • Conf. directori static
    • Configuració de les rutes: traducció de les URLs -> funcions (views).
  • views.py
    • Codi de les views (el què s'executarà abans de renderitzar la plantilla).
  • templates (carpeta) : plantilles (documents model per ser renderitzats).


Per crear una nova pàgina[modifica]

  1. Crear una nova view en views.py
    • Tenir cura de no sobreescriure el nom de la funció de la view.
  2. Afegir la ruta (URL) que ens portarà a la view:
    • A l'arxiu __init__.py
  3. Crear la plantilla (template) que renderitzarà la view.
    • Crear un nou arxiu .mako a la carpeta "templates".
    • La plantilla ha d'estar "lligada" a la view (pel paràmetre "renderer" del decorator).


1.View[modifica]

Mostrarem un petit exemple de com es passen la informació entre el codi (view) i la plantilla.

A la view generarem les dades a partir d'arxius o de bases de dades. Quan acabem de processar-ho retornarem les dades a la plantilla en forma de diccionari.

En el següent exemple retornarem 3 variables dins del diccionari:

  • nom del projecte
  • llista de productes
  • diccionari de productes i preus
@view_config(route_name='productes', renderer='productes.mako')
def productes_view(request):
   # aqui aniriem als arxius o la base de dades a buscar la informació
   # així ho simulem
   proj = "Botigueta Pro"
   prod = [ 'pepino' , 'enciam' , 'plàtan' ]
   preus = { 'pepino':'2€/kg', 'enciam':'1€/peça', 'plàtan':'2.5€/kg' }
   # els retornarem amb:
   return { "projecte":proj, "productes":prod, "preus":preus }

2.Ruta a __init__.py[modifica]

Això és necessari per que la request de la URL que demana el client es redirigeixi cap a la view.

config.add_route('productes', '/botiga') # productes=view, /botiga=URL

3.Plantilla (template .mako o .pt)[modifica]

Ara podrem utilitzar les variables retornades a la view a la plantilla productes.mako (la que s'indica al "renderer" de la view). En la plantilla (template) treballarem amb HTML, i, per exemple, per visualitzar el nom del projecte posaríem:

${projecte}

...i amb la llista i el diccionari tres quarts del mateix:

<html>
   <body>
      <h1>${projecte}</h1>
      <ul>
      % for prod in productes:
         <li>${prod}</li>
      % endfor
      </ul><br>
      El preu de l'enciam és: ${preus['enciam']}
   </body>
</html>

Alguns ajustos més perquè funcioni[modifica]

Per problemes de la codificació per defecte (unicode) cal canviar-la a "utf-8" tant als arxius com en el sistema:

Editar /usr/lib/pythonX.Y/sitecustomize.py i afegir:

import sys
sys.setdefaultencoding('utf-8')

Afegir la codificació al principi dels arxius:

# -*- coding: utf-8 -*-

Finalment cal afegir el path dels templates MAKO al main() del __init__.py:

import os
here = os.path.dirname(os.path.abspath(__file__))
settings['mako.directories'] = os.path.join(here, 'templates')