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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:00:07