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

De Cacauet Wiki
Salta a la navegació Salta a la cerca
 
(Hi ha 6 revisions intermèdies del mateix usuari que no es mostren)
Línia 66: Línia 66:
 
<br>
 
<br>
  
== Views i Plantilles (templates) ==
+
=== 1.View ===
 
Mostrarem un petit exemple de com es passen la informació entre el codi (view) i la plantilla.
 
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 aquest exemple tenim:
+
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">
 
<syntaxhighlight lang="Python">
 
@view_config(route_name='productes', renderer='productes.mako')
 
@view_config(route_name='productes', renderer='productes.mako')
 
def productes_view(request):
 
def productes_view(request):
 
   # aqui aniriem als arxius o la base de dades a buscar la informació
 
   # aqui aniriem als arxius o la base de dades a buscar la informació
   # ... posem que tenim 3 variables: pepino, enciam i plàtan
+
   # 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:
 
   # els retornarem amb:
   return { "producte1": "pepino", "producte2": "enciam", "producte3": "plàtan" }
+
   return { "projecte":proj, "productes":prod, "preus":preus }
 
</syntaxhighlight>
 
</syntaxhighlight>
  
és clar que seria més sensat tornar una llista amb els 3 productes:
+
=== 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">
 
<syntaxhighlight lang="Python">
@view_config(route_name='productes', renderer='productes.mako')
+
config.add_route('productes', '/botiga') # productes=view, /botiga=URL
def productes_view(request):
+
</syntaxhighlight>
  # aqui aniriem als arxius o la base de dades a buscar la informació
+
 
  # ... posem que una llista "verdures" amb 3 productes:
+
=== 3.Plantilla (template .mako o .pt) ===
   # verdures = [ 'pepino' , 'enciam' , 'plàtan' ]
+
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:
  # els retornarem amb:
+
${projecte}
  return { "productes": verdures }
+
...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>
 
</syntaxhighlight>
  
Per poder utilitzar aquestes variables a la plantilla (productes.mako):
+
Afegir la codificació al principi dels arxius:
...TODO...
+
# -*- 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')