Diferència entre revisions de la pàgina «Email check amb Flask»
(Hi ha 8 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 29: | Línia 29: | ||
=== Arxiu .py === | === Arxiu .py === | ||
− | Aquest és el codi per a l'arxiu .py: | + | Aquest és el codi per a l'arxiu .py |
+ | |||
+ | Fixa't en què: | ||
+ | * Capturem les dades enviades per '''POST''' a través de la variable global '''<code>request.form</code>''' , que és un diccionari. Concretament accedim amb: <pre>email = request.form["email"]</pre> | ||
+ | *: Recorda que cal importar request al inici del codi. | ||
+ | * Si es tractés de dades enviades per '''GET''' hauríem de fer servir l'atribut '''args''', d'aquesta manera:<pre>email = request.args["email"]</pre> | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
Línia 36: | Línia 41: | ||
app = Flask(__name__) | app = Flask(__name__) | ||
+ | # el decorator (@) estableix la ruta (URL). A mes, activem el mètode POST | ||
@app.route("/checkemail", methods=["GET","POST"]) | @app.route("/checkemail", methods=["GET","POST"]) | ||
def checkemail(): | def checkemail(): | ||
− | missatge = "No has enviat cap email encara per comprovar." | + | # inicialitzem missatge |
+ | miss = "No has enviat cap email encara per comprovar." | ||
if request.method == "POST": | if request.method == "POST": | ||
+ | # si entrem aquí és que ja hem enviat alguna dada del formulari (POST) | ||
email = request.form["email"] | email = request.form["email"] | ||
# quan posem accents cal avisar que és un string unicode amb la "u" a davant | # quan posem accents cal avisar que és un string unicode amb la "u" a davant | ||
− | + | miss = "L'email <b>" + email + u"</b> és incorrecte ja que no té una @" | |
# busquem que el email contingui al menys una @ i un . | # busquem que el email contingui al menys una @ i un . | ||
trobat = 0 | trobat = 0 | ||
Línia 48: | Línia 56: | ||
if trobat==0 and lletra=='@': | if trobat==0 and lletra=='@': | ||
trobat = 1 | trobat = 1 | ||
− | + | miss = "L'email <b>" + email + u"</b> té una @ pero li falta un . del domini posterior" | |
elif trobat==1 and lletra=='.': | elif trobat==1 and lletra=='.': | ||
trobat = 2 | trobat = 2 | ||
− | + | miss = "L'email <b>" + email + u"</b> és correcte! (te una @ i un . de domini)" | |
− | return render_template( "checkemail.html", missatge= | + | # renderitzem el template amb el missatge pertinent |
+ | # "missatge" serà el nom de la variable dins del template | ||
+ | return render_template( "checkemail.html", missatge=miss ) | ||
if __name__ == "__main__": | if __name__ == "__main__": | ||
Línia 58: | Línia 68: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | === Template checkmail.html === | |
− | === Template === | ||
I aquí tenim el template. Recordem que Flask utilitza Jinja2 per defecte. | I aquí tenim el template. Recordem que Flask utilitza Jinja2 per defecte. | ||
Línia 66: | Línia 75: | ||
*: això ho fem perquè si no, el propi Jinja ens filtra els tags HTML <nowiki><b> i </b></nowiki> i no ens sortiria la negreta que volem. | *: això ho fem perquè si no, el propi Jinja ens filtra els tags HTML <nowiki><b> i </b></nowiki> i no ens sortiria la negreta que volem. | ||
*: Aquest recurs es diu FILTRE, i hi ha diversos amb diferents utilitats. | *: Aquest recurs es diu FILTRE, i hi ha diversos amb diferents utilitats. | ||
+ | * Prova de treure'l i observa què passa si deixes <code><nowiki>{{missatge}}</nowiki></code> a seques. | ||
<syntaxhighlight lang="html4strict"> | <syntaxhighlight lang="html4strict"> |
Revisió de 18:44, 7 nov 2016
Aquest és un exemple de com treballar amb el microfamework web Flask per Python.
Intro[modifica]
Realitzarem una simple aplicació que agafi les dades d'un formulari per POST i ens validi si el email enviat és correcte o no.
Per decidir si el email és correcte farem una simple comprovació: primer ha d'aparèixer una @ i més tard, com a mínim un punt "." (corresponent al domini del correu). Si no té aquests dos elements el donarem per erroni i ho notificarem a l'usuari.
Per poder fer aquesta pràctica heu d'haver llegir i provar el primer exercici de Desenvolupament d'aplicacions web amb frameworks a cacauet.org
Referències:
- flask.pocoo.org
- Flask Quickstart doc
- Python: introducció ràpida
- Jinja templates
- Desenvolupament d'aplicacions web amb frameworks a cacauet.org
Recorda els diversos passos per començar el projecte:
- Has de tenir un Virtualenv per instal·lar els paquets de Python necessaris (Flask). Recorda a activar-lo amb
$ source ~/env/bin/activate
- Activa el mode de DEBUG amb:
$ export FLASK_DEBUG=1
- Arrenca el servidor amb
$ python main.py
- Apunta el browser a
http://localhost:5000
Codi[modifica]
El projecte tindrà 2 arxius:
- main.py : té el codi que processa les dades.
- checkmail.html : plantilla HTML+Jinja2. S'encarrega de la part gràfica, hem d'intentar calcular la menor quantitat de coses possibles.
Arxiu .py[modifica]
Aquest és el codi per a l'arxiu .py
Fixa't en què:
- Capturem les dades enviades per POST a través de la variable global
request.form
, que és un diccionari. Concretament accedim amb:email = request.form["email"]
- Recorda que cal importar request al inici del codi.
- Si es tractés de dades enviades per GET hauríem de fer servir l'atribut args, d'aquesta manera:
email = request.args["email"]
# -*- coding: utf-8 -*-
from flask import Flask, render_template, request
app = Flask(__name__)
# el decorator (@) estableix la ruta (URL). A mes, activem el mètode POST
@app.route("/checkemail", methods=["GET","POST"])
def checkemail():
# inicialitzem missatge
miss = "No has enviat cap email encara per comprovar."
if request.method == "POST":
# si entrem aquí és que ja hem enviat alguna dada del formulari (POST)
email = request.form["email"]
# quan posem accents cal avisar que és un string unicode amb la "u" a davant
miss = "L'email <b>" + email + u"</b> és incorrecte ja que no té una @"
# busquem que el email contingui al menys una @ i un .
trobat = 0
for lletra in email:
if trobat==0 and lletra=='@':
trobat = 1
miss = "L'email <b>" + email + u"</b> té una @ pero li falta un . del domini posterior"
elif trobat==1 and lletra=='.':
trobat = 2
miss = "L'email <b>" + email + u"</b> és correcte! (te una @ i un . de domini)"
# renderitzem el template amb el missatge pertinent
# "missatge" serà el nom de la variable dins del template
return render_template( "checkemail.html", missatge=miss )
if __name__ == "__main__":
app.run()
Template checkmail.html[modifica]
I aquí tenim el template. Recordem que Flask utilitza Jinja2 per defecte.
Fixa't en què:
- Per printar el missatge, enlloc de simplement
{{missatge}}
fem{{missatge|safe}}
- això ho fem perquè si no, el propi Jinja ens filtra els tags HTML <b> i </b> i no ens sortiria la negreta que volem.
- Aquest recurs es diu FILTRE, i hi ha diversos amb diferents utilitats.
- Prova de treure'l i observa què passa si deixes
{{missatge}}
a seques.
<html>
<body>
<h2>Validació de email</h2>
<div class="missatge">
{{missatge|safe}}
</div>
<br>
<form method="post">
Introdueix adreça d'email a comprovar: <input type="text" name="email" /><br>
<input type="submit">
</form>
</body>
</html>