地理编码失败时应先检查address是否含特殊字符并url编码,确认ak已启用地理编码权限;requests.get()返回400或空结果多因参数错误或ak无效,需用urllib.parse.quote严格编码、显式设置timeout、双重校验status和result字段。

地理编码失败时 requests.get() 返回 400 或空结果怎么办
百度地图 API 对请求参数极其敏感,status=0 仅表示接口调用成功,不代表地理编码成功;真正要看 result.location.lng 和 result.location.lat 是否存在。常见 400 错误多因 address 参数含特殊字符(如全角空格、换行)、未 URL 编码,或 ak(API Key)未正确拼接在 URL 中。
实操建议:
- 用
urllib.parse.quote(address, safe='')对地址做严格编码,不要手动替换空格为%20 - 检查
ak是否已申请并启用「地理编码 API」权限(控制台 > 应用管理 > 启用服务) - 调试时先用浏览器直接访问拼好的 URL,确认返回 JSON 中
status为 0 且result非空 - Django 视图中避免硬编码 ak,应从
settings.py读取:BDMAP_AK = os.getenv('BDMAP_AK')
在 Django View 中安全调用百度地理编码接口
不能在模板或模型里直接发 HTTP 请求,必须收口到视图层,并做好异常兜底——百度 API 不稳定,超时或限流很常见。别用 requests.get(...).json() 一步到位,中间没机会捕获网络错误。
实操建议:
- 设置显式超时:
requests.get(url, timeout=(3, 5))(3 秒连接,5 秒读取) - 用
try/except requests.exceptions.RequestException捕获所有网络异常,返回默认坐标或提示 - 对返回 JSON 做双重校验:
resp.json().get('status') == 0且'result' in resp.json() - 示例片段:
import requests from django.conf import settings def baidu_geocode(address): base_url = "https://api.map.baidu.com/geocoding/v3/" params = { 'address': address, 'output': 'json', 'ak': settings.BDMAP_AK } try: resp = requests.get(base_url, params=params, timeout=(3, 5)) data = resp.json() if data.get('status') == 0 and 'result' in data: loc = data['result']['location'] return float(loc['lng']), float(loc['lat']) except (requests.exceptions.RequestException, ValueError, KeyError): pass return None, None为什么不用 Django REST Framework 就直接写 View?
地理编码是纯工具型外部调用,不涉及序列化、权限控制或数据库操作,上 DRF 反而增加路由配置、Serializer 定义、Response 包装等冗余成本。一个函数式视图 +
JsonResponse足够清晰。实操建议:
- 路由直接配
path('api/geocode/', views.geocode_view),别卷 CBV - 前端传参统一用 query string(
?address=北京市海淀区中关村),后端用request.GET.get('address')取值 - 返回结构保持轻量:
{'lng': 116.31, 'lat': 39.99, 'formatted_address': '...'},不套data外壳 - 加个简单缓存:对相同
address的结果用cache.set(key, result, 3600)存 1 小时,减少重复调用
生产环境必须处理的三个隐藏坑
本地调试通了不等于上线能用。百度 API 在服务器环境常因 DNS、代理、IP 白名单或 HTTPS 证书问题静默失败。
实操建议:
- 确认服务器能解析
api.map.baidu.com(nslookup api.map.baidu.com),某些内网环境需配 DNS 或 hosts - 如果用了 Nginx 反向代理,确保没把
User-Agent或Host头改掉——百度会校验请求头完整性 - 百度后台绑定的「IP 白名单」必须填服务器出口公网 IP(不是内网 IP),且每行一个,末尾不能有空格
- HTTPS 站点调用 HTTP 接口会被浏览器拦截,但这是前端问题;Django 后端用 requests 调用不受影响,无需强制 HTTPS
地理编码本身不难,难的是让每次请求都稳、可查、可退。重点盯住 ak 权限、URL 编码、超时控制、白名单 IP 这四点,其他都是浮云。
- 路由直接配
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











