Diferència entre revisions de la pàgina «Pyramid en Google App Engine»

De Cacauet Wiki
Salta a la navegació Salta a la cerca
(setuptools 1.1.5 en versions.cfg)
Línia 31: Línia 31:
 
<syntaxhighlight lang="ini">
 
<syntaxhighlight lang="ini">
 
[buildout]
 
[buildout]
setuptools = 1.1.7
+
setuptools = 1.1.5
 
</syntaxhighlight>
 
</syntaxhighlight>
 
</div>
 
</div>

Revisió del 15:16, 8 nov 2013

Crearem un projecte Python: Pyramid framework per instal·lar-ho després al Google App Engine (GAE).

Instal·lant la plantilla de projecte

Treballarem amb el Buildout i el scaffold de Pyramid per GAE.

OJU: no treballeu com a root. Aquest entorn (virtualenv) està pensat per no interferir en el sistema ni barrejar llibreries.

Més coses interessants però per mirar-les després:

Seguint els passos d'aquest tutorial podem posar en marxa el nostre primer projecte.

OJU: poden aparèixer problemes de versions (al menys en Ubuntu 12.04) que cal arranjar del tutorial. La versió del pyramid_appengine (paquet amb la plantilla del buildout) no baixa en la seva darrera versió en algunes ocasions.

Troubleshooting

A data d'octubre de 2013 hi ha alguns conflictes de versions per posar en marxa un projecte de Pyramid GAE amb buildout.

Particularment el mòdul (egg) rod.recipe.appengine dóna l'error "setuptools not found".

Sol·lució actual (oct 2013)

  • Descarregar la versió correcta del pyramid_appengine amb:
    $ pip install pyramid_appengine==0.8.2-a2
  • Forçar a descarregar la darrera versió de setuptools al fitxer versions.cfg:
[buildout]
setuptools = 1.1.5

He detectat altres problemes afegits que poden donar maldecaps. No està de més fer-li un cop d'ull a:

  • Instal·lar el pip darrera versió de http://www.pip-installer.org (veure apartat install). Això no ens assegura, però que ens descarregui correctament la darrera versió de pyramid_appengine.
  • Un cop creat el buildout, canviar la versió del appengine-sdk. Anar a buildout.cfg:
    ae-sdk-version=1.8.5
    ...posant la darrera versió que trobem a la pàgina oficial de GAE.

Solucions anteriors però que no van ara:

  • Seguir el tutorial fins realitzar el
    $ bin/buildout
    ...ens donarà l'error "setuptools not found".
  • Aplicar aquest patch al mòdul rod.recipe.appengine. Modificar l'arxiu:
    $ gedit eggs/rod.recipe.appengine-2.0.2-py2.7.egg/rod/recipe/appengine/__init__.py
  • Tornar a executar el buildout i arrencar el servidor normalment.


Creant views al projecte

Per veure com utilitzar Pyramid podeu llegir Pyramid: arquitectura.


Activant plantilles Mako

Si volem utilitzar les plantilles Mako (que són les que hem utilitzat des del principi) caldrà fer alguns ajustos al projecte generat:

ULL: si afegim noves plantilles al projecte cal refer el buildout amb:
$ bin/buildout -v

__init__.py

Afegirem a la funció make_app():

...
__here__ = os.path.dirname(os.path.abspath(__file__))
...
def make_app():
    ...
    settings = {}
    settings['mako.directories'] = os.path.join(__here__, 'templates')
    config = Configurator( root_factory=Root, settings=settings )
    ...
    # afegim la URL "/home" a la que accedim amb "http://localhost:8080/home"
    config.add_route( "home", "/home" )
    config.add_view( views.home_view, route_name="home", renderer="main.mako" )

    # OJU: el config.scan() no li agrada al GAE!!


views.py

Afegirem les views pertinents:

# OJU: al GAE no li agraden els decorators @view_config !!!
def home_view( request ):
    return {"project":"gapp1"}


templates/main.mako

<html>
<head>
    <title>${project}</title>
</head>

<body>
    <h1>Projecte ${project}</h1>
    <p>Aviam que tal va aixo...</p>
</body>

</html>


Afegir plantilles

Quan afegim una nova plantilla .mako cal refer el projecte, ja que els arxius s'han de traslladar al directori "parts":

$ bin/buildout -v


Exemple: Pyges

Pyges és un projecte per CMS basat en Pyramid i GAE. Pots instal·lar-lo per tenir un exemple de codi i realitzar els exercicis proposats més avall.

Descarrega el projecte Pyges de githum.com :

$ git clone https://github.com/emieza/pyges.git

Oju, perquè hi ha 2 versions de buildout:

  • buildout.conf.lacetania: utilitza el mirror que tenim dins l'escola (taupaipai)
  • buildout.conf.main: utiltiza el servidor principal pypi.python.org . Utilitzeu-ho per treballar a casa.

Per treballar amb un o altre cal que copieu un dels dos i sobreescriviu el buildout.conf abans de començar a construir el projecte.

Construeix el projecte amb:

$ python bootstrap.py
$ bin/buildout

I finalment l'arranquem amb:

$ bin/devappserver parts/pyges --use_mtime_file_watcher

(amb aquesta opció es recarrega automàticament quan guardem canvis en algun arxiu).

Mireu-vos el codi per realitzar els exercicis que venen a continuació.


Exercici 1: Zodíac

Farem una pàgina on puguem entrar la nostra data de naixement i que ens digui el signe del zodíac que ens correspon, amb imatges estupendes per fer-ho més cool.

Mira't el codi d'exemple més amunt (projecte Pyges).

Us recomano seguir les següents passes:

  1. Crear una pàgina "home" com s'indica anteriorment en aquest tutorial i titular el nostre projecte adequadament. Substituïu la pàgina per defecte del template (elimineu la original).
  2. Afegir les fotos dels signes del zodíac a la pàgina "home". Inicialment ho farem en la plantilla .mako com si fos un HTML normal.
    Els arxius de les fotos les heu de col·locar dins el subdirectori static
  3. Canvieu el HTML del template per un bucle de la plantilla mako.
    • Des de la view cal que li passeu la llista, per exemple en la variable "imatges".
    • Consulteu a http://www.makotemplates.org com funcionen els bucles de mako.
  4. Feu un formulari per mostrar el signe del zodíac que demani a l'usuari data de naixement, que calculi el seu signe i que mostri la foto pertinent.
    La manera de recollir i utilitzar les dades d'un formulari en Pyramid (dins la view) és utilitzant la variable request.POST, de manera pràcticament idèntica al $_POST de PHP. (mireu l'exemple de Pyges més amunt). En principi hauria de ser:
    data = request.POST['data']
    Però si voleu saber si existeix la variable podeu fer
    data = request.POST.get('data')
    Una altra manera seria fent:
    if 'data' in request.POST: ...
  5. Pots afegir una "frase de la sort" aleatòria a escollir d'una llista de frases que tinguis per llegir la bonaventura de l'usuari.