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中暴露参数,可使用会话存储数据:
- 安装依赖(若未安装):
pip install itsdangerous - 配置会话中间件:
from starlette.middleware.sessions import SessionMiddleware app = FastAPI() # 生产环境请使用随机生成的安全密钥 app.add_middleware(SessionMiddleware, secret_key="your-secure-secret-key")
- 修改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)
- 更新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未配置静态文件路由。解决步骤:
- 在项目根目录创建
static文件夹,存放CSS、JS、图片等静态资源。 - 在FastAPI中挂载静态文件路由:
from fastapi.staticfiles import StaticFiles app.mount("/static", StaticFiles(directory="static"), name="static")
配置完成后,模板中的url_for调用即可正确解析静态文件路径,报错消失。
内容的提问来源于stack exchange,提问作者Jay Nila
相关产品推荐
相关产品推荐

