如何在Django的QueryDict中避免查询参数内的加号被转义消失?
问题根因
- QueryDict默认遵循
application/x-www-form-urlencoded规范解析查询字符串,该规范明确定义+对应空格,所以直接传入test=1+1时,值里的+会被替换为空格。 - 你对整段查询字符串执行
quote_plus的写法是错误的:该操作把键值分隔符=也编码为了%3D,QueryDict无法识别到键值对分隔规则,因此会把解码后的整段内容作为键,对应值为空。
解决方案
场景1:期望得到{'test': ['1+1']}(大概率是你实际需要的效果,原期望输出存在笔误)
只需要提前把原始查询字符串里的所有+替换为URL编码格式的%2B,再传入QueryDict即可:
from django.http import QueryDict my_non_safe_string = "test=1+1" processed_str = my_non_safe_string.replace('+', '%2B') result = QueryDict(processed_str) print(result) # 输出: <QueryDict: {'test': ['1+1']}>
场景2:确实需要得到你写的期望输出{'test=1+1': ['1+1']}
需要分别对键、值做URL编码后再拼接成查询字符串,不要对整段串编码:
from urllib.parse import quote_plus from django.http import QueryDict key = "test=1+1" value = "1+1" query_str = f"{quote_plus(key)}={quote_plus(value)}" result = QueryDict(query_str) print(result) # 输出: <QueryDict: {'test=1+1': ['1+1']}>
内容的提问来源于stack exchange,提问作者Coffee inTime
相关产品推荐
相关产品推荐

