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

Flask模板向Python传递变量时出现404错误问题排查

问题分析

你遇到的404问题核心原因有两个:

  • URL路径里不能直接包含空格,虽然浏览器会自动把空格转成%20,但长文本加上转义后的字符很容易触发URL长度限制(多数浏览器和服务器对URL的长度限制在2048字符左右),超过限制后请求会被截断,导致路由不匹配。
  • Flask默认的string类型路由变量(就是你用的<text>)虽然能匹配带%20的内容,但长文本场景下的URL截断才是主要诱因——短字符串"hello"长度足够小,所以能正常匹配路由。
解决方案

方案1:用查询参数传递文本(适合中短文本)

修改路由,去掉路径参数,改用查询参数获取文本:

@app.route("/download-pdf")
def download_pdf():
    original_text = request.args.get("text")
    if not original_text:
        return "缺少文本内容", 400
    # 这里写生成PDF的逻辑

模板里的表单改成通过GET方法传递查询参数:

<form action="{{ url_for('download_pdf') }}" method="GET">
    <input type="hidden" name="text" value="{{ original_text }}">
    <button type="submit">下载PDF</button>
</form>

浏览器会自动处理文本的URL编码(包括空格转%20),而且查询参数对长度的兼容性比路径参数好得多。

方案2:用POST请求传递长文本(推荐)

如果你的文本很长,直接用POST请求把文本放在请求体里,完全避开URL长度限制:

from flask import request, make_response
import pdfkit # 假设你用这个库生成PDF

@app.route("/download-pdf", methods=["POST"])
def download_pdf():
    original_text = request.form.get("text")
    if not original_text:
        return "缺少文本内容", 400
    
    # 生成PDF示例
    pdf_content = pdfkit.from_string(original_text, False)
    response = make_response(pdf_content)
    response.headers["Content-Type"] = "application/pdf"
    response.headers["Content-Disposition"] = "attachment; filename=result.pdf"
    return response

对应的模板表单:

<form action="{{ url_for('download_pdf') }}" method="POST">
    <input type="hidden" name="text" value="{{ original_text }}">
    <button type="submit">下载PDF</button>
</form>

POST请求的请求体没有严格的长度限制(仅受服务器配置影响),是长文本场景的最优解。

方案3:强制用路径参数(不推荐,仅适合短文本)

如果你一定要用路径参数,把路由变量类型改成path,它能匹配包含%20和斜杠的任意字符:

@app.route("/download-pdf/<path:text>")
def download_pdf(text):
    # 这里的text会自动把%20解码回空格
    # 生成PDF逻辑

但要注意,这种方式依然受限于URL长度,长文本还是会触发404,只适合短文本场景。

总结

优先选择POST请求传递长文本,中短文本可以用查询参数,尽量避免把长文本塞进URL路径里,这不仅能解决当前的404问题,也符合HTTP的使用规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:55:21