通过XMLRPC调用Odoo发票验证接口遇Request无session属性错误求助
问题分析与解决方案
问题现象
- 通过Python XMLRPC调用Odoo的
account.move模型action_post方法验证发票时,执行结果不稳定:- 有时成功,有时抛出错误:
AttributeError: 'Request' object has no attribute 'session' - 部分场景下,即便报错,发票仍完成验证
- 激活/关闭开发者模式后,首次验证可成功,但后续操作全部失效
- 有时成功,有时抛出错误:
可能原因
action_post作为前端触发的动作方法,内部部分逻辑依赖请求上下文(request context)中的session对象,但XMLRPC调用默认不会自动传递完整会话上下文,导致依赖缺失触发报错- 开发者模式激活时,Odoo会重置初始化部分上下文参数,让首次调用能获取临时会话信息,但后续调用因上下文未更新而失效
- 方法内部存在非原子操作:发票状态更新等核心验证逻辑已执行成功,但后续依赖会话的逻辑抛出错误,最终出现"报错但操作生效"的矛盾现象
解决方案
1. 手动传递请求上下文参数
调用execute_kw时,主动传入上下文参数,补充session相关占位信息,或获取用户默认上下文:
# 方式1:直接注入空session上下文 models.execute_kw(db, uid, password, 'account.move', 'action_post', [moveId], {'context': {'session': {}}}) # 方式2:先获取用户上下文再传递 user_context = models.execute_kw(db, uid, password, 'res.users', 'context_get', []) models.execute_kw(db, uid, password, 'account.move', 'action_post', [moveId], {'context': user_context})
2. 改用底层核心验证方法
action_post包含较多UI相关上下文依赖,可直接调用业务逻辑更纯粹的内部方法_post(注意方法名前的下划线,需确认对应Odoo版本兼容性):
models.execute_kw(db, uid, password, 'account.move', '_post', [moveId])
3. 检查版本兼容性与补丁
确认当前Odoo版本是否存在XMLRPC会话上下文的已知bug,若为版本问题,可升级至对应稳定版本或应用官方修复补丁。
4. 增加操作幂等性检查
针对"报错但操作生效"的情况,调用前先查询发票状态,避免重复执行:
# 查询目标发票状态 move_state = models.execute_kw(db, uid, password, 'account.move', 'read', [moveId, ['state']])[0]['state'] # 仅当发票未验证时执行操作 if move_state != 'posted': models.execute_kw(db, uid, password, 'account.move', 'action_post', [moveId], {'context': user_context})
内容的提问来源于stack exchange,提问作者VictorYvergniaux
相关产品推荐
相关产品推荐

