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 (login, rôles) via
GuardRules. - Aegis — Extraction unique du body (multipart, urlencoded, json) normalisée en
HashMap. - 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 →