如何在Werkzeug 2.3.0的查询参数中使用"+"字符?
解决Werkzeug 2.3.0+查询参数中"+"被替换为空格的问题
直接解决方案
以下几种方法可实现查询参数中"+"字符的保留:
手动解码查询字符串(按需处理)
绕过默认的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('目标参数名') 会保留原始的"+"字符构造URL时正确编码"+"
若请求由你方发起,构造查询参数时显式将"+"编码为%2B,确保后端能正确识别:from werkzeug.urls import url_encode params = {'token': 'abc+def123'} # 编码时禁用"+"替换为空格的规则 encoded_params = url_encode(params, plus=False) # 生成的查询参数为 token=abc%2Bdef123,后端解析后会保留"+"全局修改请求解析规则(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
相关产品推荐
相关产品推荐

