Email check amb Flask
Aquest és un exemple de com treballar amb el microfamework web Flask per Python.
Contingut
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:
# -*- 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():
missatge = "No has enviat cap email encara per comprovar."
if request.method == "POST":
email = request.form["email"]
# quan posem accents cal avisar que és un string unicode amb la "u" a davant
missatge = "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
missatge = "L'email <b>" + email + u"</b> té una @ pero li falta un . del domini posterior"
elif trobat==1 and lletra=='.':
trobat = 2
missatge = "L'email <b>" + email + u"</b> és correcte! (te una @ i un . de domini)"
return render_template( "checkemail.html", missatge=missatge )
if __name__ == "__main__":
app.run()
Template
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.
<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>