如何在axum中实现POST表单提交成功后的页面重定向
Axum 中POST请求返回重定向的实现方案
你的代码无法正常运行有两个核心原因:
- 异步块中仅写入了
store_user_info_into_db函数名,没有加()和.await实际调用该函数,数据库存储逻辑根本不会执行,这行代码仅作为无意义的废弃表达式被编译器忽略。 - 没有将业务逻辑执行结果和响应返回做串联,实际上
Redirect的使用和请求方法无关,GET、POST场景下用法完全一致,只要handler最终返回实现了IntoResponse特征的Redirect实例即可触发跳转。
正确实现代码
推荐将处理逻辑抽为独立handler函数,而非直接写在路由注册的闭包中,参考如下:
use axum::{ response::{IntoResponse, Redirect}, routing::{get, post}, Router, }; // 注册路由 let app = Router::new() .route("/", get(crate::handlers::index::root)) .route("/signup", post(signup_handler)); // signup 处理逻辑 async fn signup_handler() -> Result<Redirect, impl IntoResponse> { // 实际调用数据库存储函数,加.await执行异步逻辑 crate::handlers::signup::store_user_info_into_db().await?; // 存储成功后返回首页重定向 Ok(Redirect::to("/")) }
如果需要接收表单提交的参数,配合axum的Form提取器即可,示例:
use axum::Form; use serde::Deserialize; // 定义表单字段结构 #[derive(Deserialize)] struct SignupPayload { username: String, password: String, email: Option<String>, } async fn signup_handler(Form(payload): Form<SignupPayload>) -> Result<Redirect, impl IntoResponse> { // 将解析后的表单数据传入存储函数 crate::handlers::signup::store_user_info_into_db(payload).await?; Ok(Redirect::to("/")) }
这种POST处理完成后返回重定向的模式就是Web开发中常用的PRG(Post/Redirect/Get)模式,可以避免表单重复提交问题,axum对该模式没有额外限制,和普通GET接口返回重定向的写法完全一致。
内容的提问来源于stack exchange,提问作者tet
相关产品推荐
相关产品推荐

