Werkzeug升级后分号被视为查询字符串分隔符的原因及修复方案
问题原因
Werkzeug 2.3.x及后续版本调整了查询字符串的解析逻辑——默认同时把&和;当作参数分隔符,这是为了对齐RFC 3986和RFC 7230的规范(这两个标准明确允许分号作为查询参数分隔符)。而2.2.x及更早版本只认&,且这个变更没在更新日志里明确说明,导致升级后出现参数解析异常。
修复方案
给你三种可行的修复方式,按需选用:
1. 全局配置解析规则
在Flask应用初始化时,直接修改Werkzeug的解析配置,强制只使用&作为分隔符:
from flask import Flask app = Flask(__name__) # 配置Werkzeug仅用&拆分查询参数 app.config['WERKZEUG_URL_PARSE_OPTIONS'] = {'separator': '&'}
2. 自定义请求类(灵活控制)
如果需要更定制化的解析逻辑,可以自定义请求类,重写查询字符串的解析方法:
from flask import Flask, Request from werkzeug.datastructures import ImmutableMultiDict from werkzeug.urls import url_decode class CustomRequest(Request): def _parse_query_string(self): # 仅用&分隔参数,保留参数值里的; query_str = self.query_string.decode(self.charset) return ImmutableMultiDict(url_decode(query_str, separator='&')) app = Flask(__name__) app.request_class = CustomRequest
3. 单请求手动处理(临时应急)
如果只需要修复特定接口,可以在对应路由里手动重新解析查询字符串:
from flask import request from werkzeug.urls import url_decode @app.route('/path') def your_route(): # 手动用&解析,得到正确的参数值 parsed_params = url_decode(request.query_string, separator='&') param2 = parsed_params.get('param2') # 结果是p2value1;p2value2 # 后续业务逻辑用parsed_params替代request.params即可 return f"param2的值是: {param2}"
内容的提问来源于stack exchange,提问作者Amirth
相关产品推荐
相关产品推荐

