Diferència entre revisions de la pàgina «Python: Pyramid framework»
(Hi ha 24 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 21: | Línia 21: | ||
* Pyramid hereta les característiques dels projectes '''Pylons''' i '''repoze''' | * Pyramid hereta les característiques dels projectes '''Pylons''' i '''repoze''' | ||
* Utilitza arquitectura [http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller Model-Vista-Controlador]. | * Utilitza arquitectura [http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller Model-Vista-Controlador]. | ||
− | * Diferents modes de funcionament: Traversal | + | * Diferents modes de funcionament: |
− | * Scaffold: estructura típica dels arxius en una web amb Pyramid (models, __init__, views, etc.) | + | ** '''url_dispatcher''' : més senzill, d'orientació procedural (funcions planes, sense objectes). Utiltizarem aquest durant el curs. |
+ | ** '''Traversal''': treballem amb objectes sobre la base de dades orientada a objectes ZODB. Les aplicacions professionals com [http://plone.org/ Plone] utilitzen aquest mode. | ||
+ | * '''Scaffold''': estructura típica dels arxius en una web amb Pyramid (models, __init__, views, etc.) | ||
+ | * '''Buildout''': estructura d'arxius per facilitar el desplegament i la instal·lació de llibreries per projecte. | ||
+ | * Més articles a cacauet.org: | ||
+ | ** [[Pyramid: arquitectura]]: article per realitzar la vostra primera web en Pyramid. | ||
+ | ** [[Pyramid autenticació]]: autenticació/autorització i control de sessió: per autoritzar el pas als diversos usuaris de la nostra web. | ||
+ | ** [[Pyramid: documentant amb Sphinx]]: generació automàtica de documentació. | ||
<br> | <br> | ||
Línia 31: | Línia 38: | ||
Anem a pams: | Anem a pams: | ||
− | + | # '''Virtualenv''' (ens caldrà prèviament als scaffolds): http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/install.html | |
− | + | #* El més important a partir d'ara és '''no instal·lar cap pakage de Python (easy_install) en el sistema operatiu'''. O sigui, a partir d'ara, no hem de fer "sudo" per a res, ja que tot ho instal·larem al virtualenv (carpeta env). | |
− | + | #* Un cop instal·lat el Virtualenv, a part de poder executar els scripts dintre de la carpeta "env" (nom típic), també podem ajustar l'entorn on treballem perquè, estiguem on estiguem, utilitzem les versions de les llibreries del virtualenv (encara que no estiguem al directori "env"): <pre>$ source env/bin/activate</pre> | |
− | + | #*: Si tot ha anat bé, hem de tenir un ''prompt'' amb el nom de la carpeta del Virtualenv:<pre>(env)enric@pepino:~$</pre> | |
− | + | # '''Primer projecte en Pyramid amb "single file"''' (sense ''scaffold''): http://docs.pylonsproject.org/projects/pyramid_tutorials/en/latest/single_file_tasks/single_file_tasks.html | |
− | + | # '''Pyramid ''scaffolds''''' (esquelet de projecte): http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/project.html | |
+ | # Per començar a '''crear sites amb Pyramid''' visita l'article [[Pyramid: arquitectura]]. | ||
=== Exercicis === | === Exercicis === | ||
Línia 54: | Línia 62: | ||
=== Apache i WSGI === | === Apache i WSGI === | ||
− | * Apache i WSGI: http://code.google.com/p/modwsgi/wiki/InstallationInstructions | + | Pel servidor web Apache disposem bàsicament de dues opcions per executar codi Python: |
− | + | * mod_python: més antic | |
− | + | * mod_wsgi: més modern, és el que es fa servir més ara | |
+ | |||
+ | Ni en l'un ni en l'altre no podrem incrustar codi enmig de HTML com fem en altres llenguatges com PHP. Caldrà fer una funció "application" que serà el punt d'entrada del ''script'' i a partir d'allà executarem el codi. | ||
+ | |||
+ | |||
+ | WSGI són les inicials del '''Web Server Gateway Interface''': | ||
+ | * A Wikipedia: http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface | ||
+ | * Projecte a http://wsgi.org que et porta a http://wsgi.readthedocs.org/en/latest/ | ||
+ | |||
+ | |||
+ | Els següents links ens permetran instal·lar i configurar la primera aplicació Python per Apache, i després també com aplicar-la en un projecte Pyramid (Pylons). | ||
+ | # Instal·lar Apache i WSGI: http://code.google.com/p/modwsgi/wiki/InstallationInstructions | ||
+ | #: En distribucions derivades de Debian podem fer directament<pre># apt-get install libapache2-mod-wsgi</pre> | ||
+ | # Configurant WSGI com a WebApp: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide | ||
+ | # Configurant WSGI per executar arxius .wsgi o .py directament: http://ubuntuforums.org/showthread.php?t=833766 | ||
+ | # Integració de Apache WSGI i Pylons: http://code.google.com/p/modwsgi/wiki/IntegrationWithPylons | ||
+ | # Una altra web interessant sobre WSGI: http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi/ | ||
+ | |||
+ | ==== Exercicis WSGI ==== | ||
+ | <div class="exercici"> | ||
+ | <big>Exercicis WSGI</big> | ||
+ | # Instal·la mod_wsgi en una màquina virtual (per fer proves) i al teu AWS. | ||
+ | # Configura WSGI amb una aplicació ''Hello World!'' ubicada a /helloworld | ||
+ | #: L'arxiu .py o .wsgi pot estar on vulguis però millor el poseu a /var/www | ||
+ | # Configura WSGI per executar arxius .py o .wsgi | ||
+ | #: Creeu una nova aplicació que generi una web amb tags HTML enlloc d'un simple "Hello world!". | ||
+ | #: PISTA: penseu a canviar el "Content-Type" del ''header'' de <strike>text/plain</strike> a '''text/html'''. | ||
+ | # Agafa l'aplicació WSGI ''Hello World!'' vista aquí i llista totes les variables d'entorn. | ||
+ | #: PISTA: la variable '''''environ''''' que apareix a la funció és un diccionari amb totes les variables d'entorn. | ||
+ | # Exercici optatiu: intenta descodificar els paràmetres GET que ens arriben en la variable QUERY_STRING. | ||
+ | #: PISTA: utilitza les funcions ''parse_qs'' i ''escape'' (de la [http://docs.python.org/2/library/cgi.html CGI lib]) que es poden veure a [http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi/ aquest exemple] ("Extended Hello World"). | ||
+ | </div> | ||
+ | <br> | ||
=== Buildout === | === Buildout === | ||
Línia 69: | Línia 109: | ||
* Per generar passwords: http://stackoverflow.com/questions/2257441/python-random-string-generation-with-upper-case-letters-and-digits | * Per generar passwords: http://stackoverflow.com/questions/2257441/python-random-string-generation-with-upper-case-letters-and-digits | ||
* ... | * ... | ||
+ | |||
+ | <br> | ||
+ | |||
+ | == Autenticació == | ||
+ | Mireu-vos l'article [[Pyramid autenticació]]. | ||
<br> | <br> | ||
Línia 74: | Línia 119: | ||
== Exercicis == | == Exercicis == | ||
− | === Ex.1 | + | === Ex.1 Simple Shop === |
En els anteriors apartats hem fet un ''setup'' del ''framework''. Ara caldrà que creem alguna web pròpia utilitzant aquest entorn. | En els anteriors apartats hem fet un ''setup'' del ''framework''. Ara caldrà que creem alguna web pròpia utilitzant aquest entorn. | ||
Fes un cop de vista als Mako Templates http://www.makotemplates.org que són els més "propers" al Python, ja que tenen una sintaxi molt similar i permet incrustar codi Python entremig. Són els que utilitza l'exemple "tasks" que hem vist en el tutorial. | Fes un cop de vista als Mako Templates http://www.makotemplates.org que són els més "propers" al Python, ja que tenen una sintaxi molt similar i permet incrustar codi Python entremig. Són els que utilitza l'exemple "tasks" que hem vist en el tutorial. | ||
− | L'exercici consisteix en realitzar una web d'una botiga senzilla. | + | Crea un ''scaffold'' nou amb el nom "simpleshop". Fixa't en com estan feta la única pàgina disponible en [[Pyramid: arquitectura]]. |
− | + | ||
− | * Clients: han de poder fer comandes. | + | Crea una '''botiga web senzilla basada en arxius''': |
+ | * '''Arxiu "productes.txt"''': (s'editarà a mà) contindrà les dades (separades per tabuladors): | ||
+ | ** ID (únic) del producte | ||
+ | ** Nom del producte | ||
+ | ** Stock inicial | ||
+ | ** Preu unitari | ||
+ | * '''Arxiu "comandes.txt"''': contindrà les comandes que realitzi cada usuari. Les dades s'introduiran amb un formulari web. Contindrà: | ||
+ | ** ID (nº) de comanda | ||
+ | ** Nom/codi de l'usuari | ||
+ | ** Nom del producte | ||
+ | ** Quantitat producte | ||
+ | ** Preu producte | ||
+ | * '''Arxiu "id-comanda.txt"''': contindrà l'índex de la comanda per on anem (per indexar el comandes.txt). | ||
+ | |||
+ | Crea les següents pàgines: | ||
+ | # Una pàgina de benvinguda amb menú. | ||
+ | # Una pàgina de visualització dels productes disponibles (arxius productes.txt). | ||
+ | # Una pàgina per introduir comandes (en base als productes de l'arxiu). | ||
+ | # Una pàgina de llistat de comandes: ha de contenir un filtre per nº de comanda. | ||
+ | |||
+ | <br> | ||
+ | |||
+ | === Ex.2 Pyramid Shop === | ||
+ | Ampliació de l'exercici anterior. Ara, però, mirarem d'utilitzar la base de dades SQLite. | ||
+ | |||
+ | L'exercici consisteix en realitzar una web d'una botiga senzilla. Requeriments: | ||
+ | * Clients: han de poder fer comandes. No cal que es registrin. | ||
* Administració (o ''backend''): | * Administració (o ''backend''): | ||
** Entrar productes a la base de dades (amb preus i stock). | ** Entrar productes a la base de dades (amb preus i stock). | ||
** Modificar el ''stock'' de productes. | ** Modificar el ''stock'' de productes. | ||
− | ** | + | ** Marcar comandes com a realitzades. |
Tingues en compte que: | Tingues en compte que: | ||
* Dissenya les pàgines que ha de tenir i fes un diagrama: les "pàgines" que has fet seran "views" de Pyramid amb la seva "template". | * Dissenya les pàgines que ha de tenir i fes un diagrama: les "pàgines" que has fet seran "views" de Pyramid amb la seva "template". | ||
* Utilitza el codi del "tasks" com a model per aprendre: mira com estan fetes i fes la teva pròpia. | * Utilitza el codi del "tasks" com a model per aprendre: mira com estan fetes i fes la teva pròpia. | ||
+ | * Dissenya les taules que ha de tenir la base de dades. La pots fer en SQLite com l'exemple "tasks". |
Revisió de 11:51, 30 abr 2013
Pyramid és un framework per desenvolupament web en Python.
Contingut
Introducció[modifica]
Segons la introducció a la web de Pyramid:
Frameworks vs. Libraries A framework differs from a library in one very important way: library code is always called by code that you write, while a framework always calls code that you write. Using a set of libraries to create an application is usually easier than using a framework initially, because you can choose to cede control to library code you have not authored very selectively. But when you use a framework, you are required to cede a greater portion of control to code you have not authored: code that resides in the framework itself. You needn’t use a framework at all to create a web application using Python. A rich set of libraries already exists for the platform. In practice, however, using a framework to create an application is often more practical than rolling your own via a set of libraries if the framework provides a set of facilities that fits your application requirements. |
Tal i com diu aquest enunciat, un framework:
- té el control principal de l'aplicació, que en un moment donat el cedeix al teu codi.
- incialment aparenta ser més complex que utilizar una llibreria.
- finalment facilita molt el desenvolupament d'aplicacions.
Intro:
- http://docs.pylonsproject.org/projects/pyramid/en/1.4-branch/narr/introduction.html
- Pyramid segueix l'arquitectura Model-Vista-Controlador.
- Pyramid hereta les característiques dels projectes Pylons i repoze
- Utilitza arquitectura Model-Vista-Controlador.
- Diferents modes de funcionament:
- url_dispatcher : més senzill, d'orientació procedural (funcions planes, sense objectes). Utiltizarem aquest durant el curs.
- Traversal: treballem amb objectes sobre la base de dades orientada a objectes ZODB. Les aplicacions professionals com Plone utilitzen aquest mode.
- Scaffold: estructura típica dels arxius en una web amb Pyramid (models, __init__, views, etc.)
- Buildout: estructura d'arxius per facilitar el desplegament i la instal·lació de llibreries per projecte.
- Més articles a cacauet.org:
- Pyramid: arquitectura: article per realitzar la vostra primera web en Pyramid.
- Pyramid autenticació: autenticació/autorització i control de sessió: per autoritzar el pas als diversos usuaris de la nostra web.
- Pyramid: documentant amb Sphinx: generació automàtica de documentació.
Fase de desenvolupament[modifica]
Virutalenv és una potent eina que ens permetrà no haver d'instal·lar cap package al sistema operatiu. Podrem tenir una versió "neta" del python, sense cap llibreria, i instal·lar el què volguem sense afectar el comportarment del sistema (i, per tant, sense afectar a altres funcionalitats com l'escriptori). Cal recordar que Python és un llenguatge que s'utilitza en el Gnome i altres escritporis per aplicacions "stand-alone", pel que la instal·lació de paquets per l'escriptri podria afectar-nos al desenvolupament web i viceversa.
Anem a pams:
- Virtualenv (ens caldrà prèviament als scaffolds): http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/install.html
- El més important a partir d'ara és no instal·lar cap pakage de Python (easy_install) en el sistema operatiu. O sigui, a partir d'ara, no hem de fer "sudo" per a res, ja que tot ho instal·larem al virtualenv (carpeta env).
- Un cop instal·lat el Virtualenv, a part de poder executar els scripts dintre de la carpeta "env" (nom típic), també podem ajustar l'entorn on treballem perquè, estiguem on estiguem, utilitzem les versions de les llibreries del virtualenv (encara que no estiguem al directori "env"):
$ source env/bin/activate
- Si tot ha anat bé, hem de tenir un prompt amb el nom de la carpeta del Virtualenv:
(env)enric@pepino:~$
- Si tot ha anat bé, hem de tenir un prompt amb el nom de la carpeta del Virtualenv:
- Primer projecte en Pyramid amb "single file" (sense scaffold): http://docs.pylonsproject.org/projects/pyramid_tutorials/en/latest/single_file_tasks/single_file_tasks.html
- Pyramid scaffolds (esquelet de projecte): http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/project.html
- Per començar a crear sites amb Pyramid visita l'article Pyramid: arquitectura.
Exercicis[modifica]
- Instal·lar el virtualenv com es descriu en el link anterior.
- Crear el primer projecte Pyramid "single-file" (tasks).
- Crear un projecte Pyramid ("pyramidproject1") amb scaffolds (crear la plantilla que ve per defecte i arrencar el servidor).
- Inspecciona el contingut dels arxius, en especial __init__.py i views.py.
- Modificar el projecte "pyramidproject1" i afegir-hi una view "hello" com la que surt a la introducció:
- Aquesta view ha de retornar "Hello Enric!" si accedeixo a la URL http://localhost:6543/hello/Enric
- http://docs.pylonsproject.org/projects/pyramid/en/1.4-branch/narr/introduction.html#single-file-applications
- OJU: haureu de combinar el què veieu en l'exemple anterior, utilitzant la funció "Response" amb el què trobareu als arxius que el projecte ens ha creat, amb els decorators @view_config.
- Passar el projecte "tasks" (single-file) a un projecte amb scaffolds amb el nom "tasks2".
Fase de deployment (desplegament, producció)[modifica]
Apache i WSGI[modifica]
Pel servidor web Apache disposem bàsicament de dues opcions per executar codi Python:
- mod_python: més antic
- mod_wsgi: més modern, és el que es fa servir més ara
Ni en l'un ni en l'altre no podrem incrustar codi enmig de HTML com fem en altres llenguatges com PHP. Caldrà fer una funció "application" que serà el punt d'entrada del script i a partir d'allà executarem el codi.
WSGI són les inicials del Web Server Gateway Interface:
- A Wikipedia: http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface
- Projecte a http://wsgi.org que et porta a http://wsgi.readthedocs.org/en/latest/
Els següents links ens permetran instal·lar i configurar la primera aplicació Python per Apache, i després també com aplicar-la en un projecte Pyramid (Pylons).
- Instal·lar Apache i WSGI: http://code.google.com/p/modwsgi/wiki/InstallationInstructions
- En distribucions derivades de Debian podem fer directament
# apt-get install libapache2-mod-wsgi
- En distribucions derivades de Debian podem fer directament
- Configurant WSGI com a WebApp: http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide
- Configurant WSGI per executar arxius .wsgi o .py directament: http://ubuntuforums.org/showthread.php?t=833766
- Integració de Apache WSGI i Pylons: http://code.google.com/p/modwsgi/wiki/IntegrationWithPylons
- Una altra web interessant sobre WSGI: http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi/
Exercicis WSGI[modifica]
Exercicis WSGI
- Instal·la mod_wsgi en una màquina virtual (per fer proves) i al teu AWS.
- Configura WSGI amb una aplicació Hello World! ubicada a /helloworld
- L'arxiu .py o .wsgi pot estar on vulguis però millor el poseu a /var/www
- Configura WSGI per executar arxius .py o .wsgi
- Creeu una nova aplicació que generi una web amb tags HTML enlloc d'un simple "Hello world!".
- PISTA: penseu a canviar el "Content-Type" del header de
text/plaina text/html.
- Agafa l'aplicació WSGI Hello World! vista aquí i llista totes les variables d'entorn.
- PISTA: la variable environ que apareix a la funció és un diccionari amb totes les variables d'entorn.
- Exercici optatiu: intenta descodificar els paràmetres GET que ens arriben en la variable QUERY_STRING.
- PISTA: utilitza les funcions parse_qs i escape (de la CGI lib) que es poden veure a aquest exemple ("Extended Hello World").
Buildout[modifica]
El buildout ens permet construir projectes amb divereses versions dels packages necessaris. Així no tindrem conflictes de diverses aplicacions en un mateix entorn de producció (passaria si instal·lessim els packages al sistema).
- Article principal (cacauet): Buildout
- Variables d'entorn al fitxer .ini: http://pyramid.readthedocs.org/en/latest/narr/environment.html
- En producció, per problemes de la codificació per defecte i canviar-la a "utf-8", editar /usr/lib/pythonX.Y/sitecustomize.py i afegir:
import sys
sys.setdefaultencoding('utf-8')
- Per generar passwords: http://stackoverflow.com/questions/2257441/python-random-string-generation-with-upper-case-letters-and-digits
- ...
Autenticació[modifica]
Mireu-vos l'article Pyramid autenticació.
Exercicis[modifica]
Ex.1 Simple Shop[modifica]
En els anteriors apartats hem fet un setup del framework. Ara caldrà que creem alguna web pròpia utilitzant aquest entorn.
Fes un cop de vista als Mako Templates http://www.makotemplates.org que són els més "propers" al Python, ja que tenen una sintaxi molt similar i permet incrustar codi Python entremig. Són els que utilitza l'exemple "tasks" que hem vist en el tutorial.
Crea un scaffold nou amb el nom "simpleshop". Fixa't en com estan feta la única pàgina disponible en Pyramid: arquitectura.
Crea una botiga web senzilla basada en arxius:
- Arxiu "productes.txt": (s'editarà a mà) contindrà les dades (separades per tabuladors):
- ID (únic) del producte
- Nom del producte
- Stock inicial
- Preu unitari
- Arxiu "comandes.txt": contindrà les comandes que realitzi cada usuari. Les dades s'introduiran amb un formulari web. Contindrà:
- ID (nº) de comanda
- Nom/codi de l'usuari
- Nom del producte
- Quantitat producte
- Preu producte
- Arxiu "id-comanda.txt": contindrà l'índex de la comanda per on anem (per indexar el comandes.txt).
Crea les següents pàgines:
- Una pàgina de benvinguda amb menú.
- Una pàgina de visualització dels productes disponibles (arxius productes.txt).
- Una pàgina per introduir comandes (en base als productes de l'arxiu).
- Una pàgina de llistat de comandes: ha de contenir un filtre per nº de comanda.
Ex.2 Pyramid Shop[modifica]
Ampliació de l'exercici anterior. Ara, però, mirarem d'utilitzar la base de dades SQLite.
L'exercici consisteix en realitzar una web d'una botiga senzilla. Requeriments:
- Clients: han de poder fer comandes. No cal que es registrin.
- Administració (o backend):
- Entrar productes a la base de dades (amb preus i stock).
- Modificar el stock de productes.
- Marcar comandes com a realitzades.
Tingues en compte que:
- Dissenya les pàgines que ha de tenir i fes un diagrama: les "pàgines" que has fet seran "views" de Pyramid amb la seva "template".
- Utilitza el codi del "tasks" com a model per aprendre: mira com estan fetes i fes la teva pròpia.
- Dissenya les taules que ha de tenir la base de dades. La pots fer en SQLite com l'exemple "tasks".