Diferència entre revisions de la pàgina «Pyramid: arquitectura»
(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.
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')