Diferència entre revisions de la pàgina «Pyramid: arquitectura»
| (Hi ha 6 revisions intermèdies del mateix usuari que no es mostren) | |||
| Línia 66: | Línia 66: | ||
| <br> | <br> | ||
| − | ==  | + | === 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  | + | 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ó | ||
| − |     #  | + |     # 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 { " | + |     return { "projecte":proj, "productes":prod, "preus":preus } | 
| </syntaxhighlight> | </syntaxhighlight> | ||
| − | és  | + | === 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"> | ||
| − | + | 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> | </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.
Contingut
Aïllament del codi i el disseny[modifica]
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).
- 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.
- ... hi ha un gran nombre de sistemes de plantilles.
 
Per crear una nova pàgina[modifica]
- 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).
 
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')

