bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


python_web

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
python_web [2021/09/23 09:45]
enrique_mieza_sanchez [Per saber-ne més]
python_web [2022/12/13 18:43] (actual)
enric_mieza_sanchez [Testing]
Línia 11: Línia 11:
   - **Bottle** : microframework   - **Bottle** : microframework
  
 +Referències:
 +  * Per desenvolupar en Python necessitarem [[Python venv]]
 +  * L'article segueix a [[Python Web Test]]
 +
 +{{tag> #Daw #DawMpDual #DawMp07Uf1 #DawMp07Uf02 #DawMp07Uf03 #DawMp07Uf04 #DawMp07Uf1 #DawMp07Uf02 #DawMp07Uf03 #DawMp07Uf04 #Ciber #CiberMp03 #Ceti #CetiMp03 python web flask }}
 +
 +
 +\\
 +
 +===== Videotutorials =====
 Aquest article també el tens en [[https://www.youtube.com/watch?v=bHg1b0XcU3g|dues parts en format vídeotutorial a Youtube]] explicat pas a pas. Aquest article també el tens en [[https://www.youtube.com/watch?v=bHg1b0XcU3g|dues parts en format vídeotutorial a Youtube]] explicat pas a pas.
  
Línia 17: Línia 27:
 {{youtube>pv1_CPLg4xw}} {{youtube>pv1_CPLg4xw}}
  
- +\\
-{{tag> #Daw #DawMpDual #DawMp07Uf1 #DawMp07Uf02 #DawMp07Uf03 #DawMp07Uf04 #DawMp07Uf1 #DawMp07Uf02 #DawMp07Uf03 #DawMp07Uf04 #Ciber #CiberMp03 }}+
  
 ===== Instal·lació ===== ===== Instal·lació =====
 Necessitem Python 3, que ja sol venir instal·lat. Si no fos així, pots instal·lar-ho amb: Necessitem Python 3, que ja sol venir instal·lat. Si no fos així, pots instal·lar-ho amb:
  
-    $ sudo apt install python3 +  $ sudo apt install python3
- +
-A més, necessitem **pip3**, el gestor de paquets per a Python més conegut: +
- +
-    $ sudo apt install python3-pip +
- +
-Ara podrem instal·lar el paquet **virtualenv**, que ens servirà per crear entorns aïllats amb les seves pròpies llibreries. Així podrem diposar de diferents configuracions per cada projecte, i a més, no tenir conflictes amb les que python3 té instal·lades al sistema operatiu: +
- +
-    $ sudo pip3 install virtualenv +
- +
-Podem comprovar les llibreries instal·lades en el sistema operatiu fent +
- +
-    $ pip3 freeze +
- +
-Podem crear ara, un entorn de test: +
- +
-    $ virtualenv envtest +
- +
-Activem el virtualenv: +
- +
-    $ source envtest/bin/activate +
- +
-Veureu que el //prompt// ara indica el nom del virtualenv. Si ara mirem les llibreries veurem que està buit: +
- +
-    (envtest) $ pip3 freeze+
  
-Podem instal·lar la primera llibreria, per exemple:+Necessitem crear un [[python_venv|entorn virtual de Python]]. La manera més senzilla és:
  
-    (envtest) pip3 install flask+  python -m venv env
  
-Si comproveu amb ''pip3 freeze'' veureu que apareix la llibreria //flask// i totes les seves dependències.+I podem activar el nostre entorn amb:
  
-En qualsevol moment podem sortir del nostre virtualenv amb la instrucció ''deactivate''+  $ source env/bin/activate
  
-    (envtest) $ deactivate+Per saber més sobre els entorns virtuals de Python visiteu l'article [[python_venv]].
  
 \\ \\
Línia 69: Línia 54:
 Dins el nostre projecte crearem un virtualenv on posarem les nostres llibreries: Dins el nostre projecte crearem un virtualenv on posarem les nostres llibreries:
  
-    $ virtualenv env+    $ python -m venv env
     $ source env/bin/activate     $ source env/bin/activate
     (env) $ pip3 install flask     (env) $ pip3 install flask
Línia 75: Línia 60:
 Ara ja podem mirar [[https://flask.palletsprojects.com/quickstart|el quickstart de la documentació de Flask]]. Crearem l'arxiu amb el codi super simple de //Hello World// a l'arxiu ''web.py'': Ara ja podem mirar [[https://flask.palletsprojects.com/quickstart|el quickstart de la documentació de Flask]]. Crearem l'arxiu amb el codi super simple de //Hello World// a l'arxiu ''web.py'':
  
-    (env) $ gedit web.py +    (env) $ gedit web.py &
- +
-Per simplificar una mica, podem afegir al codi inicial dues línies al final de l'arxiu: +
-<sxh python> +
-if __name__ == "__main__": +
-    app.run() +
-</sxh>+
  
 I ara podrem arrencar la aplicació //Hello World// amb: I ara podrem arrencar la aplicació //Hello World// amb:
  
-    (env) $ python3 web.py+    (env) $ flask --app web run
  
 Podeu visitar la web //Hello World// apuntant el vostre navegador a ''http://localhost:5000'' Podeu visitar la web //Hello World// apuntant el vostre navegador a ''http://localhost:5000''
  
 +\\
  
 ===== Avançant amb Flask ===== ===== Avançant amb Flask =====
-==== Aplicació mínima ==== 
-Com podeu veure al [[https://flask.palletsprojects.com/quickstart|quickstart de Flask]], en molt poques línies (5 en concret) es pot crear una aplicació base. 
- 
-Li hem afegit una línia més per arrencar l'aplicació amb més facilitat. La transcric aquí per més comoditat: 
-<file python web.py> 
-from flask import Flask 
-app = Flask(__name__) 
- 
-@app.route('/') 
-def hello_world(): 
-    return 'Hello, World!' 
- 
-# arranquem l'aplicació 
-if __name__ == "__main__": 
-    app.run(debug=True) 
-</file> 
- 
-Arrencant amb ''debug=True'' tindrem missatges d'error més clars i //autoreload// quan apliquem canvis a l'arxiu. Podem arrencar-la amb: 
-  (env) $ python web.py 
- 
-I mirar el resultat apuntant el //browser// a: 
-  http://127.0.0.1:5000/ 
  
 ==== Routing ==== ==== Routing ====
Línia 120: Línia 78:
  
 <file python web.py> <file python web.py>
 +#... codi previ...
 +
 @app.route('/hello') @app.route('/hello')
 def hello(): def hello():
     return 'Hello again!'     return 'Hello again!'
 +
 +#...mes codi...
 </file> </file>
  
Línia 164: Línia 126:
 </WRAP> </WRAP>
  
-==== Variables globals (shhht! q no ho senti ningú!) ==== +\\ 
-En un entorn web no és recomanable utilitzar variables globals. O més aviat, no podem utilitzar-les com solem fer-ho en les aplicacions corrents. Les aplicacions web s'executen en algun servidor web (Apache, Nginx) o servidor d'aplicacions (uwsgi, gunicorn, Heroku).+ 
 +===== Variables globals (shhht! q no ho senti ningú!) ===== 
 +En un entorn web no és recomanable utilitzar variables globals. O més aviat, no podem utilitzar-les com solem fer-ho en aplicacions d'escriptori. Les aplicacions web s'executen en algun servidor web (Apache, Nginx) o servidor d'aplicacions (uwsgi, gunicorn, Heroku).
  
 De fet, sí que es poden fer servir, però no es pot confiar en què en la següent execució la variable global es mantingui. El servidor web, depenent de la seva càrrega, pot destruir el procés d'execució de la teva aplicació web, i quan tornes a sol·licitar la web, es torna a posar en marxa tot des de zero (i, per tant, destruint les variables globals). De fet, sí que es poden fer servir, però no es pot confiar en què en la següent execució la variable global es mantingui. El servidor web, depenent de la seva càrrega, pot destruir el procés d'execució de la teva aplicació web, i quan tornes a sol·licitar la web, es torna a posar en marxa tot des de zero (i, per tant, destruint les variables globals).
Línia 285: Línia 249:
   * [[https://jinja.palletsprojects.com/en/2.11.x/templates/#include|Includes]] és una senzilla manera d'afegir capçalera i //footers// iguals a totes les nostres pàgines. Us recomano utilitzar això per començar.   * [[https://jinja.palletsprojects.com/en/2.11.x/templates/#include|Includes]] és una senzilla manera d'afegir capçalera i //footers// iguals a totes les nostres pàgines. Us recomano utilitzar això per començar.
   * [[https://jinja.palletsprojects.com/en/2.11.x/templates/#template-inheritance|Herència de plantilles]] és un mètode una mica més sofisticat amb alguns avantatges, però costa una mica més d'entendre. Cal definir una pàgina //master// dividida en ''blocks'' o seccions, i després derivar les pàgines filles (on podem definir o sobreescriure cada ''block'').   * [[https://jinja.palletsprojects.com/en/2.11.x/templates/#template-inheritance|Herència de plantilles]] és un mètode una mica més sofisticat amb alguns avantatges, però costa una mica més d'entendre. Cal definir una pàgina //master// dividida en ''blocks'' o seccions, i després derivar les pàgines filles (on podem definir o sobreescriure cada ''block'').
- 
- 
- 
  
 \\ \\
  
-===== Testing ===== +===== Per a saber-ne més ===== 
-Anem a veure com podem testejar les nostres aplicacions fetes amb Flask.+Hem fet un repàs de les funcions bàsiques del //framework// Flask. Ens queda un parell de temes per cobrir tots els temes essencials, i que podeu seguir investigant en el propi [[https://flask.palletsprojects.com/quickstart/|quickstart de Flask]]:
  
-Fem-li un cop d'ull a la [[https://flask.palletsprojects.com/testing/|documentació de test amb Flask]].+  * Persistència en base de dades 
 +  * Sessions
  
-Primera cosa que cal fer, instal·lar el mòdul de tests ''pytest'': 
-  (env) $ pip install pytest 
  
-Després, ens diuen que fem un **test skeleton**, però l'exemple que ens donen té una configuració avançada per posar punt la base de dades, utilitzant una //app factory//, etc.+També hi ha aquest cursos que poden ser interessants: 
 +  [[https://courses.miguelgrinberg.com/p/flask-mega-tutorial|mega-tutorial de Flask de Miguel Grinberg]] que té un índex prometedor. Podeu fer un cop d'ull les introduccions, la resta del curs és de pagament. 
 +  * [[https://platzi.com/cursos/flask/|Aquest curs de Flask de Plazi.com]] pinta molt béamb videotutorials en castellà.
  
-Nosaltres implementarem una versió simplificada sobre l'arxiu ''test_web.py'':+\\
  
-<file python test_web.py > 
-import pytest 
  
-from web import app+===== Exercici : login ===== 
 +<WRAP todo> 
 +Pàgina de login de l'app:
  
-@pytest.fixture 
-def client(): 
-    with app.test_client() as client: 
-        yield client 
- 
-def test_landing_page(client): 
- rv = client.get('/') 
- assert b'Hello, World' in rv.data 
-</file> 
- 
-Correm els tests amb la comanda ''pytest'': 
-<code> 
-(env) $ pytest 
-============================ test session starts ============================= 
-platform linux -- Python 3.8.10, pytest-6.2.5, py-1.10.0, pluggy-1.0.0 
-rootdir: /home/enric/dev21/basicflask 
-collected 1 item                                                              
- 
-test_web.py .                                                          [100%] 
- 
-============================= 1 passed in 0.09s ============================== 
-</code> 
- 
-**Com podem veure, ''pytest'' posa en marxa els tests dels arxius que comencen per ''test_'', i dins d'aquests, corre les funcions que també comencin per ''test_''.** 
- 
-==== Exercici ==== 
-<WRAP todo> 
-Examina [[https://flask.palletsprojects.com/en/2.0.x/testing/#logging-in-and-out|la secció "logging in and out" de la documentació dels tests]] i realitza el següent exercici: 
   * Crea un formulari que demani usuari i contrasenya. El formulari s'accedeix per mètode GET però envia les dades per mètode POST.   * Crea un formulari que demani usuari i contrasenya. El formulari s'accedeix per mètode GET però envia les dades per mètode POST.
   * Crea una pàgina (per POST) que respongui al formulari d'usuari i contrasenya. Crea un diccionari global amb noms d'usuari i contrasenyes vàlids (//hardcoded//).   * Crea una pàgina (per POST) que respongui al formulari d'usuari i contrasenya. Crea un diccionari global amb noms d'usuari i contrasenyes vàlids (//hardcoded//).
   * Assegura't que la pàgina de resposta al formulari respon amb un missatge que contingui un "OK" a la pàgina, i si el nom d'usuari és erroni respon adequadament amb un missatge que contingui "ERROR".   * Assegura't que la pàgina de resposta al formulari respon amb un missatge que contingui un "OK" a la pàgina, i si el nom d'usuari és erroni respon adequadament amb un missatge que contingui "ERROR".
   * **Comprova manualment el punt anterior. Abans de fer els tests automàtics cal fer-los manuals PER A TOTS ELS CASOS** (tant si funciona OK, com si dona error).   * **Comprova manualment el punt anterior. Abans de fer els tests automàtics cal fer-los manuals PER A TOTS ELS CASOS** (tant si funciona OK, com si dona error).
-  * Afegeix dues funcions de test que comprovin el següent: 
-    - Que els usuaris i contrasenyes que has //hardcodejat// al codi es loguen correctament. 
-    - Que una combinació usuari/contrasenya que no ha estat introduïda no funciona i dona el missatge d'error. 
 </WRAP> </WRAP>
  
 \\ \\
  
-===== Per a saber-ne més ===== +===== Testing i + =====
-Hem fet un repàs de les funcions bàsiques del //framework// Flask. Ens queda un parell de temes per cobrir tots els temes essencials, i que podeu seguir investigant en el propi [[https://flask.palletsprojects.com/quickstart/|quickstart de Flask]]:+
  
-  * Persistència en base de dades +Aquest article continua a [[Python Web Test]] a [[Docker Flask]].
-  * Sessions +
- +
- +
-També hi ha aquest cursos que poden ser interessants: +
-  * [[https://courses.miguelgrinberg.com/p/flask-mega-tutorial|mega-tutorial de Flask de Miguel Grinberg]] que té un índex prometedor. Podeu fer un cop d'ull les introduccions, la resta del curs és de pagament. +
-  * [[https://platzi.com/cursos/flask/|Aquest curs de Flask de Plazi.com]] pinta molt bé, amb videotutorials en castellà.+
  
 \\ \\
  
python_web.1632390308.txt.gz · Darrera modificació: 2021/09/23 09:45 per enrique_mieza_sanchez