Aller au contenu

Écrire en base

Objectif : enregistrer une nouvelle ligne en base à partir d'un formulaire, avec une requête INSERT paramétrée.

Ce que vous allez apprendre : insérer une donnée avec insert(...), après avoir validé la saisie côté serveur comme au palier « Validation serveur ».

MessageController possède déjà la méthode index (palier précédent) qui lit la table first_sql_messages, et mvc/routes.py déclare la route /message.
L'import insert et la constante INSERT_MESSAGE sont déjà présents dans le contrôleur.

Nous ajoutons deux méthodes, deux routes et un gabarit.

Documentations

Pour bien comprendre ce palier :

Document Ce qu'il apporte
L'objet Request l'accesseur form(...) pour lire la saisie
La protection CSRF le champ caché csrf_token requis pour le POST
Migrations SQL la table first_sql_messages créée au palier précédent
Contrôleurs

Ajoutez ces deux méthodes à la classe MessageController :

    @staticmethod
    def create(request: Request) -> Response:
        return BaseController.render(
            "message/first_sql_write.html",
            request=request,
            context={"csrf_token": BaseController.csrf_token(request)},
        )

    @staticmethod
    def store(request: Request) -> Response:
        content = request.form("content", default="").strip()
        if not content:
            return Response.text("Le message est obligatoire", status=422)
        insert(INSERT_MESSAGE, (content,))
        return Response.text(f"Message enregistré : {content}")
Élément Rôle
insert(INSERT_MESSAGE, (content,)) Exécute la requête INSERT ... VALUES (?) en passant la valeur séparément : le ? est un paramètre lié, ce qui protège contre l'injection SQL.
.strip() + status=422 La saisie est validée avant l'écriture : un message vide est refusé, comme au palier « Validation serveur ».
BaseController.csrf_token(request) Fournit le jeton à placer dans le champ caché du formulaire.

Après l'insertion, la ligne devient visible : /message peut désormais renvoyer un autre contenu si vous en avez enregistré un.

Routes

Ajoutez les deux routes (GET et POST) dans le groupe public de mvc/routes.py :

# mvc/routes.py
from core.http.router import Router
from mvc.controllers.home_controller import HomeController
from mvc.controllers.welcome_controller import WelcomeController
from mvc.controllers.message_controller import MessageController

router = Router()

with router.group("", public=True) as public:
    public.add("GET", "/", HomeController.index, name="home-index")
    public.add("GET",  "/welcome", WelcomeController.index, name="welcome-index")
    public.add("GET",  "/welcome/hello", WelcomeController.hello, name="welcome-hello")
    public.add("GET",  "/welcome/html", WelcomeController.html, name="welcome-html")
    public.add("GET",  "/welcome/article/{id}", WelcomeController.article, name="welcome-article")
    public.add("GET",  "/welcome/debug", WelcomeController.debug, name="welcome-debug")
    public.add("GET",  "/welcome/json", WelcomeController.json_demo, name="welcome-json")
    public.add("GET",  "/welcome/csrf", WelcomeController.csrf, name="welcome-csrf")
    public.add("GET",  "/welcome/form", WelcomeController.form, name="welcome-form")
    public.add("POST", "/welcome/form-submit", WelcomeController.form_submit, name="welcome-form_submit")
    public.add("GET",  "/welcome/validate", WelcomeController.validate, name="welcome-validate")
    public.add("POST", "/welcome/validate-submit", WelcomeController.validate_submit, name="welcome-validate_submit")
    public.add("GET",  "/message", MessageController.index, name="message-index")
    public.add("GET",  "/message/create", MessageController.create, name="message-create")
    public.add("POST", "/message/store", MessageController.store, name="message-store")
Vues

Créez le gabarit mvc/views/message/first_sql_write.html :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="utf-8">
    <title>Écrire en base</title>
</head>
<body>
    <h1>Écrire en base</h1>
    <form method="post" action="/message/store">
        <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
        <label>Message : <input type="text" name="content" value=""></label>
        <button type="submit">Enregistrer</button>
    </form>
</body>
</html>
Tests
URL Résultat
https://localhost:8000/message/create le formulaire d'enregistrement
Soumettre Bonjour la base Message enregistré : Bonjour la base
Soumettre vide Le message est obligatoire (statut 422)
À retenir
  • insert(requete, (valeur,)) écrit une ligne avec des paramètres liés.
  • Le ? paramétré protège contre l'injection SQL.
  • On valide toujours la saisie avant d'écrire en base.

Vous avez parcouru tous les paliers du niveau débutant. Place au bilan.

Continuer avec le Bilan