Extraction de formulaire — `request.form()`
request.form() est une méthode intégrée dans Request qui orchestre un pipeline complet en coulisses :
request.form() est une méthode intégrée dans Request qui orchestre un pipeline complet en coulisses :
- Sentinel — Vérifie les règles d'accès de la route (
GuardRules: connecté, staff, superutilisateur, groupes) contre le compte relu en base. - Aegis — Extraction unique du body (multipart, urlencoded, json) normalisée en
HashMap, dans la limite de taille de la requête. Pour un multipart, aucun fichier n'est écrit avant un jeton CSRF valide (en-têteX-CSRF-Token, ou champcsrf_tokenplacé avant les fichiers). - CSRF Gate — Vérifie le token CSRF dans les données parsées.
- Construction — Crée le formulaire
T, remplit les champs et lance la validation.
use runique::prelude::*;
pub async fn inscription(mut request: Request) -> AppResult<Response> {
let form: RegisterForm = request.form();
if let Ok(validated) = ValidationForm::try_new(form, &request).await {
// Formulaire valide → traitement
}
// ...
}
💡 Le développeur appelle simplement
request.form()— tout le pipeline sécurité est transparent.
Exemple complet — afficher, valider, enregistrer
Un même handler gère l'affichage (GET) et la soumission (POST). request.form() construit le formulaire dans les deux cas : vide au GET, rempli depuis le body au POST.
use runique::prelude::*;
pub async fn inscription(mut request: Request) -> AppResult<Response> {
let form: RegisterForm = request.form();
let template = "inscription_form.html";
// GET (rien soumis) ou POST invalide → réafficher avec les erreurs
let mut validated = match ValidationForm::try_new(form, &request).await {
Ok(validated) => validated,
Err(form) => {
context_update!(request => { "inscription_form" => &form });
return request.render(template);
}
};
// POST valide — enregistrer
match validated.save(&request.engine.db).await {
Ok(user) => {
success!(request.notices => format!("Bienvenue {} !", user.username));
return Ok(Redirect::to("/").into_response());
}
Err(err) => {
// Erreur DB (ex. contrainte unique) reportée sur le formulaire
validated.database_error(&err);
}
}
context_update!(request => { "inscription_form" => &*validated });
request.render(template)
}
Points clés :
request.form()renvoie un formulaire utilisable directement — pas de construction manuelle.ValidationForm::try_new(form, &request).awaitdispatche sur la méthode HTTP (allow_get/allow_post) puis valide ;Okprouve au niveau du type que le formulaire a été validé,Errrenvoie le formulaire avec ses erreurs de champ à ré-afficher (rendues automatiquement par{{ form.inscription_form | form }}).validated.save(&request.engine.db).awaitpersiste l'entité et renvoie le modèle créé.database_error(&err)reporte une erreur DB (ex. email déjà pris) comme erreur de formulaire plutôt que comme 500 — appelable directement surValidationFormsans passer parinto_form().
← Formulaires | Trait RuniqueForm →