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

Django获取GET查询参数时+号被自动替换为空格问题排查

问题根因

这是符合URL查询字符串编码规范的正常行为:application/x-www-form-urlencoded 格式的查询参数中,+ 号是空格的标准编码表示,所以Django默认的GET参数解析逻辑会自动将+替换为空格,仅%2B才会被解析为原义的+号。该问题和你提供的路由配置无关。


解决方法

方案1:前端请求时对参数做URL编码(推荐)

前端发起请求前,对at参数的值执行URL编码处理,比如JavaScript中使用encodeURIComponent()方法,会自动将+转义为%2B,Django解析时即可拿到带原义+的参数值。
示例中原始参数2018-10-14T14:34:40+0100编码后为2018-10-14T14%3A34%3A40%2B0100,Django解析后可正常得到原始值。

方案2:后端简单替换空格(快速适配)

如果前端无法修改请求逻辑,且确认at参数的时间格式中本身不存在合法空格,可以在后端拿到参数后直接将空格替换回+:

@api_view(['GET'])
def getCurrentWeather(request, city):
   at = request.GET["at"].replace(' ', '+')
   print(at)

   return JsonResponse({"status": "ok"}, status=200)

方案3:自行解析原始查询字符串(无歧义方案)

如果参数中可能同时存在合法空格和原义+号,可以直接读取请求的原始查询字符串自行解析,规避Django默认的转换逻辑:

from urllib.parse import parse_qs

@api_view(['GET'])
def getCurrentWeather(request, city):
   # 读取未经过Django解析的原始查询串
   raw_query = request.META.get('QUERY_STRING', '')
   # 先将所有+替换为%2B保留原义,再做参数解析
   processed_query = raw_query.replace('+', '%2B')
   query_params = parse_qs(processed_query)
   at = query_params.get('at', [None])[0]
   print(at)

   return JsonResponse({"status": "ok"}, status=200)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:18:03