Introducció
WTForms és una biblioteca de Python que facilita la creació i validació de formularis web. En aquest tema, aprendrem com integrar WTForms amb Flask per gestionar la validació de formularis de manera eficient i segura.
Objectius
- Entendre què és WTForms i per què és útil.
- Aprendre a crear formularis amb WTForms.
- Implementar la validació de formularis.
- Gestionar errors de validació i proporcionar retroalimentació a l'usuari.
Què és WTForms?
WTForms és una biblioteca que permet definir formularis com a classes de Python. Això facilita la gestió de la lògica de validació i la generació de formularis HTML. Alguns avantatges de WTForms són:
- Separació clara de la lògica de validació i la presentació.
- Suport per a múltiples tipus de camps i validacions.
- Integració fàcil amb Flask mitjançant l'extensió Flask-WTF.
Instal·lació
Per començar a utilitzar WTForms amb Flask, primer hem d'instal·lar l'extensió Flask-WTF:
Creació d'un Formulari amb WTForms
Definició del Formulari
Comencem definint un formulari simple amb WTForms. Crearem un formulari de registre d'usuari amb camps per al nom d'usuari, correu electrònic i contrasenya.
# forms.py from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Email, Length class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)]) email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired(), Length(min=6)]) submit = SubmitField('Sign Up')
Explicació del Codi
FlaskForm
: Classe base per a tots els formularis de WTForms en Flask.StringField
,PasswordField
,SubmitField
: Tipus de camps de formulari.validators
: Llista de validacions aplicades a cada camp. En aquest cas, utilitzemDataRequired
,Email
iLength
.
Integració del Formulari en una Vista de Flask
Ara integrem el formulari en una vista de Flask i gestionem la seva validació.
# app.py from flask import Flask, render_template, flash, redirect, url_for from forms import RegistrationForm app = Flask(__name__) app.config['SECRET_KEY'] = 'your_secret_key' @app.route('/register', methods=['GET', 'POST']) def register(): form = RegistrationForm() if form.validate_on_submit(): flash(f'Account created for {form.username.data}!', 'success') return redirect(url_for('home')) return render_template('register.html', form=form) if __name__ == '__main__': app.run(debug=True)
Explicació del Codi
SECRET_KEY
: Clau secreta necessària per a la protecció de formularis contra CSRF (Cross-Site Request Forgery).validate_on_submit()
: Mètode que valida el formulari quan es fa una sol·licitud POST.flash()
: Funció per mostrar missatges flash a l'usuari.
Plantilla HTML
Finalment, creem una plantilla HTML per renderitzar el formulari.
<!-- templates/register.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Register</title> </head> <body> <h1>Register</h1> <form method="POST" action=""> {{ form.hidden_tag() }} <p> {{ form.username.label }}<br> {{ form.username(size=32) }}<br> {% for error in form.username.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p> <p> {{ form.email.label }}<br> {{ form.email(size=32) }}<br> {% for error in form.email.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p> <p> {{ form.password.label }}<br> {{ form.password(size=32) }}<br> {% for error in form.password.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p> <p>{{ form.submit() }}</p> </form> </body> </html>
Explicació del Codi
form.hidden_tag()
: Genera un camp ocult per a la protecció CSRF.form.username
,form.email
,form.password
: Renderitza els camps del formulari.form.username.errors
,form.email.errors
,form.password.errors
: Mostra els errors de validació.
Exercici Pràctic
Exercici
Crea un formulari de login amb camps per al correu electrònic i la contrasenya. Implementa la validació per assegurar-te que els camps no estiguin buits i que el correu electrònic tingui un format vàlid.
Solució
# forms.py class LoginForm(FlaskForm): email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) submit = SubmitField('Login') # app.py @app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): flash(f'Logged in as {form.email.data}!', 'success') return redirect(url_for('home')) return render_template('login.html', form=form) # templates/login.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h1>Login</h1> <form method="POST" action=""> {{ form.hidden_tag() }} <p> {{ form.email.label }}<br> {{ form.email(size=32) }}<br> {% for error in form.email.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p> <p> {{ form.password.label }}<br> {{ form.password(size=32) }}<br> {% for error in form.password.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </p> <p>{{ form.submit() }}</p> </form> </body> </html>
Conclusió
En aquest tema, hem après a utilitzar WTForms per crear i validar formularis en una aplicació Flask. Hem vist com definir formularis, integrar-los en vistes de Flask i proporcionar retroalimentació d'errors als usuaris. La validació de formularis és una part crucial de qualsevol aplicació web, i WTForms facilita aquesta tasca de manera eficient i segura.
Curs de Desenvolupament Web amb Flask
Mòdul 1: Introducció a Flask
- Què és Flask?
- Configuració del Teu Entorn de Desenvolupament
- Creant la Teva Primera Aplicació Flask
- Entenent l'Estructura d'una Aplicació Flask
Mòdul 2: Conceptes Bàsics de Flask
- Enrutament i Mapeig d'URL
- Gestió de Mètodes HTTP
- Renderització de Plantilles amb Jinja2
- Treballant amb Fitxers Estàtics
Mòdul 3: Formularis i Entrada d'Usuari
Mòdul 4: Integració de Bases de Dades
- Introducció a Flask-SQLAlchemy
- Definició de Models
- Realització d'Operacions CRUD
- Migracions de Bases de Dades amb Flask-Migrate
Mòdul 5: Autenticació d'Usuaris
- Registre d'Usuaris
- Inici i Tancament de Sessió d'Usuaris
- Hashing de Contrasenyes
- Gestió de Sessions d'Usuaris
Mòdul 6: Conceptes Avançats de Flask
- Blueprints per a Aplicacions Grans
- Gestió d'Errors
- Pàgines d'Error Personalitzades
- Registre i Depuració
Mòdul 7: APIs RESTful amb Flask
- Introducció a les APIs RESTful
- Creació de Punts Finals RESTful
- Gestió de Dades JSON
- Autenticació per a APIs
Mòdul 8: Desplegament i Producció
- Configuració de Flask per a Producció
- Desplegament a Heroku
- Desplegament a AWS
- Monitorització i Optimització del Rendiment
Mòdul 9: Proves i Millors Pràctiques
- Proves Unitàries amb Flask
- Proves d'Integració
- Cobertura de Proves
- Millors Pràctiques per al Desenvolupament amb Flask