Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
dev:python:flask:flask_formulaires_wtforms [2025/02/23 16:17] – créée yoann | dev:python:flask:flask_formulaires_wtforms [2025/03/09 13:57] (Version actuelle) – yoann | ||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
:TODO: | :TODO: | ||
- | ====== Python : Formulaires WT-Forms ====== | + | ====== Python : Gestion des formulaires via Flask-WTF ====== |
+ | |||
+ | [[https:// | ||
+ | |||
+ | Ici on utilise le paquet Flask-WTF qui intègre la bibliothèque WTForms au micro framework Flask. | ||
+ | |||
+ | ===== Initialiser l' | ||
+ | |||
+ | Création d'un dépôt git pour le projet et initialisation de l' | ||
+ | |||
+ | <code bash> | ||
+ | git init hello-wtf | ||
+ | cd hello-wtf/ | ||
+ | git branch -m main | ||
+ | |||
+ | # Création de l' | ||
+ | python3 -m venv venv | ||
+ | source venv/ | ||
+ | pip install Flask Flask-WTF | ||
+ | |||
+ | # Création de l' | ||
+ | mkdir -p helloforms/ | ||
+ | touch helloforms/ | ||
+ | chmod a+x helloforms/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | Peupler le fichier '' | ||
+ | |||
+ | <code python __init__.py> | ||
+ | # | ||
+ | |||
+ | from flask import Flask | ||
+ | |||
+ | |||
+ | app = Flask(__name__) | ||
+ | |||
+ | |||
+ | @app.route('/' | ||
+ | def show_home_page(): | ||
+ | """ | ||
+ | |||
+ | """ | ||
+ | return '< | ||
+ | |||
+ | |||
+ | |||
+ | if __name__ == ' | ||
+ | |||
+ | # execution en mode debug | ||
+ | app.run(debug=True) | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Tester l' | ||
+ | |||
+ | <code bash> | ||
+ | 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 ' | ||
+ | * 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:// | ||
+ | Press CTRL+C to quit | ||
+ | * Restarting with stat | ||
+ | * Debugger is active! | ||
+ | * Debugger PIN: 845-679-934 | ||
+ | </ | ||
+ | |||
+ | Ouvrir son navigateur à l'URL '' | ||
+ | |||
+ | {{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 '' | ||
+ | * L' | ||
+ | |||
+ | |||
+ | <code python> | ||
+ | from flask_wtf import FlaskForm | ||
+ | from wtforms import EmailField, SubmitField | ||
+ | from wtforms.fields.simple import BooleanField | ||
+ | |||
+ | class NewsLetterForm(FlaskForm): | ||
+ | |||
+ | email = EmailField(label=' | ||
+ | news_letter = BooleanField(label=" | ||
+ | submit_button = SubmitField(label=' | ||
+ | </ | ||
+ | |||
+ | Comme illustré ci-dessus, le constructeur des objets héritant de la classe de base '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | |||
+ | La liste exhaustive des paramètres est disponible dans la documentation [[https:// | ||
+ | |||
+ | |||
+ | Quelques objets représentant les champs de base des formulaires : | ||
+ | |||
+ | * **StringField** : Champ type texte ; | ||
+ | * **TextAreaField** : | ||
+ | * **SelectField** : | ||
+ | * **BooleanField** : Champ de type checkbox ; | ||
+ | * **PasswordField** | ||
+ | * **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), | ||
+ | |||
+ | * Retirer les espaces en début et fin de saisie ; | ||
+ | * Passer la saisie en majuscule, en minuscule ; | ||
+ | * Arrondir etc. | ||
+ | |||
+ | |||
+ | <code python> | ||
+ | from flask_wtf import FlaskForm | ||
+ | from wtforms import StringField | ||
+ | |||
+ | class RegisterForm(FlaskForm): | ||
+ | |||
+ | lastname = StringField(label=' | ||
+ | | ||
+ | | ||
+ | |||
+ | </ | ||
+ | |||
+ | 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' | ||
+ | |||
+ | |||
+ | <code python> | ||
+ | from flask_wtf import FlaskForm | ||
+ | from wtforms import StringField | ||
+ | from wtforms.validators import DataRequired, | ||
+ | |||
+ | class RegisterForm(FlaskForm): | ||
+ | |||
+ | email = StringField(label=' | ||
+ | </ | ||
+ | |||
+ | Ici on instancie deux validators pour contraindre la saisie de l' | ||
+ | * Le champs ne doit pas être vide, | ||
+ | * La saisie doit respecter le formalisme d'un email. | ||
+ | |||
+ | Dans ce cas, peut également utiliser l' | ||
+ | |||
+ | <code python> | ||
+ | from flask_wtf import FlaskForm | ||
+ | from wtforms import EmailField | ||
+ | |||
+ | |||
+ | class RegisterForm(FlaskForm): | ||
+ | |||
+ | email = EmailField(label=' | ||
+ | </ | ||
+ | |||
+ | Il existe de nombreux validators citons par exemple **DataRequired**, | ||
+ | |||
+ | * Ici la [[https:// | ||
+ | |||
+ | ===== Validation ===== | ||
+ | |||
+ | C'est la fonction contrôleur qui se charge de valider le formulaire retourné en méthode POST | ||
===== Références ===== | ===== Références ===== | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
* https:// | * https:// | ||
* https:// | * https:// | ||
+ | * Vidéo [[https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ |