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
相关产品推荐
相关产品推荐

