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

Flask与Quart如何避免默认路径参数触发重定向?

Flask避免默认参数路由重定向的解决方案

问题场景

现有Flask服务代码:

from flask import Flask, jsonify, Blueprint

app = Flask(__name__)

@app.route("/<int:d>")
@app.route("/", defaults={"d": 1})
def a(d):
    return jsonify({"d": d})
  • 访问/2时返回正常响应:
    $ curl http://localhost:5000/2
    {
      "d": 2
    }
    
  • 访问/1时会触发301重定向到/,导致无法处理重定向的客户端异常:
    $ curl http://localhost:5000/1
    <!doctype html>
    <html lang=en>
    <title>Redirecting...</title>
    <h1>Redirecting...</h1>
    <p>You should be redirected automatically to the target URL: <a href="http://localhost:5000/">http://localhost:5000/</a>. If not, click the link.
    

解决方法

方法1:关闭路由严格匹配(推荐)

给两个路由都添加strict_slashes=False参数,同时调整路由顺序(将默认路由放在前面),让Flask不再对等价URL进行重定向:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/", defaults={"d": 1}, strict_slashes=False)
@app.route("/<int:d>", strict_slashes=False)
def a(d):
    return jsonify({"d": d})

修改后访问/或/1都会直接返回对应JSON响应,不会触发重定向。

方法2:拆分独立路由

将默认路径和带参数路径拆分为两个独立路由,避免Flask识别为等价URL:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/")
def default_d():
    return jsonify({"d": 1})

@app.route("/<int:d>")
def get_d(d):
    return jsonify({"d": d})

这种方式下,/和/1会匹配不同的视图函数,各自返回结果,没有重定向逻辑。

原因解释

Flask默认会将带有defaults参数的路由变体(如/1对应/的默认值)视为非规范URL,自动发送301重定向到规范路径。上述两种方法分别通过关闭严格路由检查或拆分路由,绕过了这个自动重定向机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:35:26