You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:09:16