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

FastAPI中POST路由向GET路由传数据方法及static路由报错解决

FastAPI问题解决:POST向GET传数据与static路由报错

一、实现POST向GET传递数据

要将POST路由的处理结果传递给GET路由,推荐两种可行方案:

方案1:重定向+查询参数

修改POST路由,处理预测后重定向到GET的/predict路由,通过查询参数携带结果:

from fastapi.responses import RedirectResponse

@app.post("/predict", response_class=HTMLResponse)
async def predict(
    mintempC: float = Form(...),
    maxtempC: float = Form(...),
    humidity: float = Form(...),
    DewPointC: float = Form(...),
    pressure: float = Form(...),
    cloudcover: float = Form(...),
    visibility: float = Form(...),
    precipMM: float = Form(...),
    city : int = Form(...),  
    raintoday: int = Form(...),
):
    pred = model.predict([[maxtempC, mintempC, DewPointC, cloudcover, humidity, pressure, visibility, precipMM, city, raintoday]])[0]
    return RedirectResponse(url=f"/predict?prediction={pred}", status_code=303)

更新GET路由,接收查询参数并传入模板:

from typing import Optional

@app.get("/predict", response_class=HTMLResponse)
async def get_predict(request: Request, prediction: Optional[int] = None):
    return templates.TemplateResponse("predict.html", {"request": request, "prediction": prediction})

之后可在predict.html中通过{{ prediction }}获取并展示结果。

方案2:会话(Session)传递数据

若不想在URL中暴露参数,可使用会话存储数据:

  1. 安装依赖(若未安装):pip install itsdangerous
  2. 配置会话中间件:
from starlette.middleware.sessions import SessionMiddleware

app = FastAPI()
# 生产环境请使用随机生成的安全密钥
app.add_middleware(SessionMiddleware, secret_key="your-secure-secret-key")
  1. 修改POST路由,将结果存入会话:
@app.post("/predict", response_class=HTMLResponse)
async def predict(request: Request,
    mintempC: float = Form(...),
    # 其余Form参数保持不变
):
    pred = model.predict([[maxtempC, mintempC, DewPointC, cloudcover, humidity, pressure, visibility, precipMM, city, raintoday]])[0]
    request.session["prediction"] = int(pred)
    return RedirectResponse(url="/predict", status_code=303)
  1. 更新GET路由,读取会话中的数据:
@app.get("/predict", response_class=HTMLResponse)
async def get_predict(request: Request):
    prediction = request.session.pop("prediction", None) # 读取后移除,避免重复展示
    return templates.TemplateResponse("predict.html", {"request": request, "prediction": prediction})

二、解决static路由匹配报错

starlette.routing.NoMatchFound错误是因为模板中使用url_for("static", filename="xxx")引用静态文件,但FastAPI未配置静态文件路由。解决步骤:

  1. 在项目根目录创建static文件夹,存放CSS、JS、图片等静态资源。
  2. 在FastAPI中挂载静态文件路由:
from fastapi.staticfiles import StaticFiles

app.mount("/static", StaticFiles(directory="static"), name="static")

配置完成后,模板中的url_for调用即可正确解析静态文件路径,报错消失。


内容的提问来源于stack exchange,提问作者Jay Nila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:05:12