Email check amb Flask
Aquest és un exemple de com treballar amb el microfamework web Flask per Python.
Intro
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
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
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
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>