Django中调用Braintree生成客户端令牌抛出XML解析错误问题咨询
问题排查与解决思路
xml.parsers.expat.ExpatError: not well-formed (invalid token) 报错的核心原因是Braintree SDK收到的网关响应不是预期的XML格式,而是其他类型的内容(比如HTML错误页、空响应、乱码内容),解析失败触发报错。由于相同配置在Python Shell中可正常运行,说明配置本身无问题,问题出在Django运行环境和Shell环境的差异,可按以下步骤排查:
- 优先修复代码语法错误
你提供的视图代码存在括号未闭合的问题,braintree.BraintreeGateway初始化时,传入Configuration参数后缺少闭合右括号,会导致网关配置对象生成异常,发出的请求格式错误触发网关返回异常内容:# 修复前(缺右括号) gateway = braintree.BraintreeGateway( braintree.Configuration( braintree.Environment.Sandbox, merchant_id="xxxxxxxxxx", public_key="xxxxxxxxxxxx", private_key="xxxxxxxxxxxxxxxxxxxxxx" ) # 修复后 gateway = braintree.BraintreeGateway( braintree.Configuration( braintree.Environment.Sandbox, merchant_id="xxxxxxxxxx", public_key="xxxxxxxxxxxx", private_key="xxxxxxxxxxxxxxxxxxxxxx" ) ) - 打印网关返回的原始响应内容定位问题
临时添加异常捕获逻辑,打印SDK收到的原始响应,确认返回的具体内容:import traceback try: client_token = gateway.client_token.generate() except Exception as e: traceback.print_exc() # 打印原始响应,不同SDK版本可通过对应属性获取 if hasattr(e, "response"): print("网关原始响应内容:", getattr(e.response, "text", e.response)) - 排查网络代理/拦截规则
Django运行环境如果配置了全局HTTP代理、防火墙拦截、反向代理规则,可能会拦截发往Braintree沙箱地址的请求,返回403/502等错误的HTML页面,导致SDK解析失败。可对比Django运行环境和Shell环境的网络配置,确认Braintree沙箱域名可正常访问。 - 排查Django中间件影响
如果你项目中配置了自定义的请求/响应拦截中间件,可能会篡改Braintree SDK的请求参数或响应内容,可临时注释所有自定义中间件后重试验证。 - 对比依赖版本差异
分别在Django运行的虚拟环境和测试用的Shell环境执行pip list | grep braintree,确认braintree SDK版本是否一致,版本差异也可能导致兼容性问题。
内容的提问来源于stack exchange,提问作者Sumit Kumar
相关产品推荐
相关产品推荐

