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

