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

如何在Werkzeug 2.3.0的查询参数中使用"+"字符?

解决Werkzeug 2.3.0+查询参数中"+"被替换为空格的问题

直接解决方案

以下几种方法可实现查询参数中"+"字符的保留:

  1. 手动解码查询字符串(按需处理)
    绕过默认的request.args解析逻辑,直接基于原始查询字符串解码并关闭plus替换规则:

    from werkzeug.urls import url_decode
    
    # 获取原始查询字符串并解码
    raw_query = request.query_string.decode('utf-8')
    args = url_decode(raw_query, plus=False)
    # 此时 args.get('目标参数名') 会保留原始的"+"字符
    
  2. 构造URL时正确编码"+"
    若请求由你方发起,构造查询参数时显式将"+"编码为%2B,确保后端能正确识别:

    from werkzeug.urls import url_encode
    
    params = {'token': 'abc+def123'}
    # 编码时禁用"+"替换为空格的规则
    encoded_params = url_encode(params, plus=False)
    # 生成的查询参数为 token=abc%2Bdef123,后端解析后会保留"+"
    
  3. 全局修改请求解析规则(Flask场景)
    自定义请求类,全局关闭查询参数的"+"替换行为:

    from flask import Flask, Request
    from werkzeug.urls import url_decode
    
    class CustomRequest(Request):
        def _parse_args(self):
            # 用自定义规则解析查询参数
            raw_query = self.query_string.decode(self.charset)
            self.args = url_decode(raw_query, plus=False)
    
    app = Flask(__name__)
    app.request_class = CustomRequest
    

原因说明

Werkzeug 2.3.0开始严格遵循application/x-www-form-urlencoded标准规范,该规范定义查询参数中的"+"等价于空格,因此默认解析逻辑会自动替换。如果你的业务场景中"+"是需要保留的普通字符,就需要通过上述方法显式关闭这个替换行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:47:12