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
相关产品推荐
相关产品推荐

