Générer des formulaires web avec Flask en 2 minutes !

Générer des formulaires web avec Flask en 2 minutes !

Il est fréquent d'avoir besoin d'un formulaire à portée de main pour récolter certaines informations. Nous allons voir comment générer des formulaires web très simplement avec Flask, un framework Python permettant de créer des applications web.

Mise en place

Commençons par installer Flask et Flask-wtf avec Pip, le gestionnaire de paquets de Python.

pip install flask flask-wtf

Voici la structure du projet que vous devriez avoir :

mon_projet/
├── app.py
└── templates/
    └── form.html

Voici un exemple de code app.py :

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SelectField, SubmitField
from wtforms.validators import DataRequired, URL

app = Flask(__name__)
app.secret_key = 'supersecretkey'  # CSRF token

class ToolSubmissionForm(FlaskForm):
    name = StringField("Nom de l'outil", validators=[DataRequired()])
    url = StringField("URL du projet", validators=[DataRequired(), URL()])
    description = TextAreaField("Description", validators=[DataRequired()])
    technologies = StringField("Technos utilisées (séparées par des virgules)", validators=[DataRequired()])
    license = SelectField("Type de licence", choices=[
        ('mit', 'MIT'),
        ('apache', 'Apache 2.0'),
        ('gpl', 'GPLv3'),
        ('bsd', 'BSD'),
        ('proprietary', 'Propriétaire')
    ])
    submit = SubmitField("Soumettre l'outil")

@app.route('/', methods=['GET', 'POST'])
def index():
    form = ToolSubmissionForm()
    if form.validate_on_submit():
        return (
            f"<h2>Outil reçu ! 🚀</h2>"
            f"<p><strong>Nom :</strong> {form.name.data}</p>"
            f"<p><strong>URL :</strong> <a href='{form.url.data}' target='_blank'>{form.url.data}</a></p>"
            f"<p><strong>Description :</strong> {form.description.data}</p>"
            f"<p><strong>Technos :</strong> {form.technologies.data}</p>"
            f"<p><strong>Licence :</strong> {form.license.data}</p>"
        )
    return render_template('form.html', form=form)

if __name__ == '__main__':
    app.run(debug=True)
app.py

Ce code Flask a besoin de s'appuyer sur un template html comme suivant:

templates/form.html

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Formulaire</title>
</head>
<body>
    <h1>Propose ton outil 🔧</h1>
    <form method="POST">
        {{ form.hidden_tag() }}
        <p>
            {{ form.name.label }}<br>
            {{ form.name(size=40) }}
        </p>
        <p>
            {{ form.url.label }}<br>
            {{ form.url(size=60) }}
        </p>
        <p>
            {{ form.description.label }}<br>
            {{ form.description(rows=4, cols=60) }}
        </p>
        <p>
            {{ form.technologies.label }}<br>
            {{ form.technologies(size=60) }}
        </p>
        <p>
            {{ form.license.label }}<br>
            {{ form.license() }}
        </p>
        <p>{{ form.submit() }}</p>
    </form>
</body>
</html>
templates/form.html

Maintenant que notre code Flask ainsi que le template html est en place, pour lancer le serveur web, exécuter la commande suivante

python app.py

Puis, accéder en localhost:5000 sur votre navigateur web.

Pour aller plus loin

Cet article montre la structure du projet basique, à vous de l'adapter à votre contexte ainsi que de l'améliorer !

Pour aller plus loin dans l'amélioration, il est possible de

  • Utiliser un framework pour le desing de type Tailwind CSS
  • Conteneuriser l'application avec Docker (essentiel !)
  • Connecter une base de données (PostgreSQL, MySQL, SQLite etc...)
  • Sécuriser d'avantage l'application
  • Ajouter de l'authentification
  • Avoir une gestion d'erreurs/codes retour accrue