{{tag>dev python web formulaire}}
:TODO:
====== Python : Gestion des formulaires via Flask-WTF ======
[[https://wtforms.readthedocs.io/en/3.2.x/|WTForms]] est une bibliothèque Python permettant de gérer des formulaires web via des Classes et objets en POO.
Ici on utilise le paquet Flask-WTF qui intègre la bibliothèque WTForms au micro framework Flask.
===== Initialiser l'application Flask =====
Création d'un dépôt git pour le projet et initialisation de l'application Flask :
git init hello-wtf
cd hello-wtf/
git branch -m main
# Création de l'environnement et installation des packages
python3 -m venv venv
source venv/bin/activate
pip install Flask Flask-WTF
# Création de l'application Flask
mkdir -p helloforms/{static,templates}
touch helloforms/__init__.py
chmod a+x helloforms/__init__.py
Peupler le fichier ''helloforms/__init__.py'' :
#!/usr/bin/env python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def show_home_page():
"""Build and return home page
"""
return 'Hello World!!!
'
if __name__ == '__main__':
# execution en mode debug
app.run(debug=True)
Tester l'application via la commande **flask run**:
FLASK_APP=helloforms FLASK_ENV=development flask run --debug
A ce stade la commande doit lancer le serveur web et afficher un message du type :
* Serving Flask app 'helloforms'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 845-679-934
Ouvrir son navigateur à l'URL ''http://localhost:5000'' doit afficher le message "Hello World!!!"
{{capture-2025-02-27_01.png}}
Pour la mise en forme, on utilise le framework Spectre CSS
===== Création du formulaire =====
* Pour créer un formulaire, on définit une classe héritant de **FlaskForm**.
* Chaque attribut de la notre classe représentant un champ de formulaire sera un objet héritant de la classe de base ''wtforms.fields.Field'' ;
* L'objet de type formulaire est instancié et traité par le contrôleur (la fonction associée à la route Flask) et transmis à la vue (le template).
from flask_wtf import FlaskForm
from wtforms import EmailField, SubmitField
from wtforms.fields.simple import BooleanField
class NewsLetterForm(FlaskForm):
email = EmailField(label='Email')
news_letter = BooleanField(label="S'abonner à la news letter")
submit_button = SubmitField(label='Valider')
Comme illustré ci-dessus, le constructeur des objets héritant de la classe de base ''wtforms.fields.Field'' accepte notamment les paramètres :
* ''label'' : le label associé au champ ;
* ''default'' : valeur par défaut du champ, peut être un ''callable'' (un nom de fonction exécutable) ;
* ''description'' : une description associée au champ, utilisée généralement par les help text ;
* ''filters'' : tableau, séquence de ''callable'' exécutés pour traiter les données du champ ;
* ''validators'' : tableau de validators appelés lors de l'exécution de ''validate''.
La liste exhaustive des paramètres est disponible dans la documentation [[https://wtforms.readthedocs.io/en/3.2.x/fields/#basic-fields]]
Quelques objets représentant les champs de base des formulaires :
* **StringField** : Champ type texte ;
* **TextAreaField** :
* **SelectField** :
* **BooleanField** : Champ de type checkbox ;
* **PasswordField** : Champ de saisie de mot de passe
* **HiddenField** : Champ masqué ;
* **SubmitField** : Bouton soumission du formulaire ;
Champs plus spécifiques :
* **EmailField** ;
* **TelField** ;
* **URLField** ;
* **TimeField** ;
* **ColorField** ;
* **IntegerField** : Saisie d'un nombre entier;
* **IntegerRangeField**
* **FloatField**
* **DecimalRangeField** ;
* **FileField**
===== filters =====
Les filtres permettent de traiter (en amont de la validation), les valeurs saisies par l'utilisateur. On les utilise couramment pour :
* Retirer les espaces en début et fin de saisie ;
* Passer la saisie en majuscule, en minuscule ;
* Arrondir etc.
from flask_wtf import FlaskForm
from wtforms import StringField
class RegisterForm(FlaskForm):
lastname = StringField(label='Nom', default="DOE",
filters=[str.strip, str.upper],
description="Champ de saisie de votre nom")
Ci-dessus, on utilise les filtres pour retirer les espaces autour de la saisie et la passer en majuscules.
===== validators =====
Les **validators** permettent de contrôler la saisie de l'utilisateur. On les importe depuis ''wtforms.validators''.
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired, Email
class RegisterForm(FlaskForm):
email = StringField(label='Email', validators=[DataRequired(),Email()])
Ici on instancie deux validators pour contraindre la saisie de l'utilisateur :
* Le champs ne doit pas être vide,
* La saisie doit respecter le formalisme d'un email.
Dans ce cas, peut également utiliser l'objet EmailField :
from flask_wtf import FlaskForm
from wtforms import EmailField
class RegisterForm(FlaskForm):
email = EmailField(label='Email')
Il existe de nombreux validators citons par exemple **DataRequired**, **Length**, **Email**, **URL**, **NumberRange**, **IPAddress**, **MacAddress**, **Regexp**, etc. Il est possible de définir ses propres validators.
* Ici la [[https://wtforms.readthedocs.io/en/3.2.x/validators/|documentation exhaustive des validators WTForms]]
===== Validation =====
C'est la fonction contrôleur qui se charge de valider le formulaire retourné en méthode POST
===== Références =====
* [[https://flask-wtf.readthedocs.io/en/1.2.x/|Documentation Officielle Flask-WTF]]
* [[https://wtforms.readthedocs.io/en/3.2.x/|Documentation Officielle WTForms]]
* [[https://spectre-org.github.io/spectre-docs/docs/get-started/|Documentation Framework CSS Spectre]]
* https://zephyrnet.com/fr/manipulation-de-formulaires-en-flacon-avec-flacon-wtforms/
* https://fr.python-3.com/?p=1882
* Vidéo [[https://youtu.be/HvEkVffiNXQ| Créer des formulaires avec Flask-WTF]]
* https://picturepan2.github.io/spectre/getting-started.html
* https://spectre-org.github.io/spectre-docs/docs/layout/
* [[https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms| Les formulaires dans Flask (miguelgrinberg.com)]]