You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:42:16