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

FastAPI中POST与GET传值异常:跳转页面无法携带输入数据

解决跳转并携带输入数据到books页面的问题

你的核心问题在于两个逻辑冲突:点击a标签时既触发POST请求又执行默认跳转,且/books路由调用get_books()时未传递参数,导致Body对象直接被调用casefold()方法引发报错。同时你前端POST请求传递的字段info与后端接收的prompt不匹配,这也是数据无法正确传递的隐藏问题。以下是几种可行的解决方案:

方案一:改用GET请求携带查询参数跳转(最直接)

将输入数据作为URL查询参数传递,无需POST请求:

1. 后端代码调整

from fastapi import Query

@app.get('/get_books')
async def get_books(prompt: str = Query(...)):
    book_list = []
    for book in BOOKS:
        if (book.get('title').casefold() == prompt.casefold() 
            or book.get('author').casefold() == prompt.casefold() 
            or book.get('category').casefold() == prompt.casefold()):
            book_list.append(book)
    return book_list

@app.get('/books', response_class=HTMLResponse)
async def books(request: Request, prompt: str = Query(None)):
    book_list = []
    if prompt:
        book_list = await get_books(prompt)
    return templates.TemplateResponse("books.html", {"request": request, 'book_list': book_list})

2. 前端代码修改

阻止a标签默认跳转行为,手动构造带查询参数的URL后跳转:

<a id="btn" class="main__arrow" href="#"><i class="fa-solid fa-arrow-right"></i></a>
const el = document.getElementById('btn');

el.addEventListener('click', function(e){
    e.preventDefault();
    const info = document.getElementById("prompt").value;
    window.location.href = `/books?prompt=${encodeURIComponent(info)}`;
});

方案二:先POST获取数据,再跳转传递结果

若必须使用POST请求,可先获取查询结果,再通过URL参数传递给/books页面:

1. 后端代码调整

import json
from fastapi import Query

@app.post('/get_books')
async def get_books(prompt = Body()):
    book_list = []
    for book in BOOKS:
        if (book.get('title').casefold() == prompt.casefold() 
            or book.get('author').casefold() == prompt.casefold() 
            or book.get('category').casefold() == prompt.casefold()):
            book_list.append(book)
    return book_list

@app.get('/books', response_class=HTMLResponse)
async def books(request: Request, book_data: str = Query(None)):
    book_list = []
    if book_data:
        book_list = json.loads(book_data)
    return templates.TemplateResponse("books.html", {"request": request, 'book_list': book_list})

2. 前端代码修改

const el = document.getElementById('btn');

el.addEventListener('click', async function(e){
    e.preventDefault();
    const info = document.getElementById("prompt").value;
    const response = await fetch("/get_books", {
            method: "POST",
            headers: { "Accept": "application/json", "Content-Type": "application/json" },
            body: JSON.stringify({ prompt: info }) // 字段名与后端保持一致
        });
        if (response.ok) {
            const bookList = await response.json();
            const encodedData = encodeURIComponent(JSON.stringify(bookList));
            window.location.href = `/books?book_data=${encodedData}`;
        } else {
            console.log(response);
        }
});

方案三:用HTML表单提交跳转(无需JS)

直接通过表单提交自动携带查询参数跳转:

<form action="/books" method="GET">
    <input type="text" id="prompt" name="prompt">
    <button type="submit" class="main__arrow"><i class="fa-solid fa-arrow-right"></i></button>
</form>

后端代码与方案一一致即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:55:24