Diferència entre revisions de la pàgina «Email check amb Flask»
| (Hi ha 6 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 40: | Línia 45: | ||
def checkemail():  | def checkemail():  | ||
     # inicialitzem missatge  |      # 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  | + |          # 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 51: | 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)"  | |
     # renderitzem el template amb el missatge pertinent  |      # renderitzem el template amb el missatge pertinent  | ||
| − |      return render_template( "checkemail.html", missatge=  | + |     # "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 62: | Línia 68: | ||
</syntaxhighlight>  | </syntaxhighlight>  | ||
| − | === Template ===  | + | === Template checkmail.html ===  | 
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 69: | 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>