You need to enable JavaScript to run this app. Flask API端点path类型参数被截断,查询参数丢失如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Flask API端点path类型参数被截断,查询参数丢失如何解决?

问题原因

HTTP 路由解析规则中,?是固定作为整个请求的查询字符串分隔符,不管你是否使用Flask的path类型参数转换器,Flask处理请求时会先把请求路径中第一个?之后的所有内容全部剥离,归入request.args查询参数集合,不会被计入路由路径的匹配内容。你现在要传递的目标URL里的?会被Flask识别为整个接口请求的查询分隔符,因此你定义的url参数只能拿到?之前的路径内容,问号后的内容自然丢失。

解决方案

下面提供三种可落地的处理方式:

  • 方式一:客户端对传入URL编码
    客户端发起请求前,将作为参数传递的目标URL进行百分号编码,把特殊字符?编码为%3F、&编码为%26、/编码为%2F,编码后请求地址示例如下:
    http://127.0.0.1:5000/price/https%3A%2F%2Fpuresourceindia.in%2Fstore%2Findex.php%3Froute%3Dproduct%2Fproduct%26product_id%3D479/
    这种方案不需要修改后端代码,Flask会自动将编码后的内容解码后赋值给url参数,即可拿到完整的目标URL。

  • 方式二:后端拼接查询字符串
    如果无法要求客户端做编码处理,后端可以主动把当前请求的查询字符串拼接回url参数,修改后的代码如下:

from flask import Flask, request

app = Flask(__name__)

@app.route('/price/<path:url>/')
def Ex(url):
    # 存在查询字符串时拼接到参数后
    if request.query_string:
        url += '?' + request.query_string.decode('utf-8')
    return {'urlwas': url}

app.run()
  • 方式三:改用POST请求传递参数
    对于包含大量特殊字符的URL参数,更稳妥的方式是改用POST请求,把目标URL放在请求体中传递,完全避开路由解析的特殊字符截断问题,代码示例:
from flask import Flask, request

app = Flask(__name__)

@app.route('/price/', methods=['POST'])
def Ex():
    url = request.json.get('url')
    return {'urlwas': url}

app.run()

客户端发起POST请求时,请求头设置Content-Type: application/json,请求体传入对应JSON内容即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 22:06:04