AJAX POST向Django视图传递GeoJSON字符串出现异常字符问题
AJAX传GeoJSON到Django后端POST报错的解决办法
问题根因
你用application/x-www-form-urlencoded格式传递包含GeoJSON的streetWeb变量时,前端打印字符串正常,但Django后端解析request.POST出错。这是因为x-www-form-urlencoded会自动转义特殊字符,而GeoJSON包含大量引号、嵌套结构,极易引发编码解码混乱,导致后端解析出现异常字符。
两种解决办法
办法1:改用JSON格式传递数据
直接将请求内容改为JSON格式,从根源避免编码冲突:
$.ajax({ type: 'POST', url: $('#confImp').data('url'), contentType: "application/json; charset=utf-8", data: JSON.stringify({ "csrfmiddlewaretoken": csrftoken, 'streetWeb': toExpwe, 'int_points': toExpip }), success: function(res){ // 你的业务处理逻辑 } })
Django视图中这样获取数据:
import json def your_view(request): if request.method == 'POST': data = json.loads(request.body) street_web = data.get('streetWeb') int_points = data.get('int_points') # 后续业务代码
办法2:手动编码GeoJSON字符串再传递
如果必须使用x-www-form-urlencoded格式,先对GeoJSON字符串做URL编码:
$.ajax({ type: 'POST', url: $('#confImp').data('url'), contentType: "application/x-www-form-urlencoded; charset=utf-8", data: { "csrfmiddlewaretoken": csrftoken, 'streetWeb': encodeURIComponent(toExpwe), 'int_points': encodeURIComponent(toExpip) }, success: function(res){ // 你的业务处理逻辑 } })
Django视图中解码后使用:
from urllib.parse import unquote def your_view(request): if request.method == 'POST': street_web = unquote(request.POST.get('streetWeb', '')) int_points = unquote(request.POST.get('int_points', '')) # 后续业务代码
额外提醒
x-www-form-urlencoded仅适合简单键值对,GeoJSON这类复杂嵌套结构优先用JSON格式,能减少很多编码相关的麻烦。- 可以先在前端用
JSON.parse(toExpwe)验证toExpwe是否为合法的GeoJSON字符串,排除本身格式错误的可能。
内容的提问来源于stack exchange,提问作者CLU
相关产品推荐
相关产品推荐

