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

Odoo Online定时动作调用requests报错,求简洁解决方案

Odoo Online定时动作调用Webhook的问题及解决办法

问题场景

我需要用Odoo的定时动作实现一个简单任务,代码如下:

webhook_url = 'https://xxxxx'

recs = model.search([("x_studio_processed", "=", False)])

for rec in recs:
    data = recs.x_studio_json_text    # json_text是存储JSON格式文本的字段
    requests.post(webhook_url, data=data)

运行时触发以下错误:

RPC_ERROR
Odoo Server Error
Traceback (most recent call last):
File "/home/odoo/src/odoo/odoo/tools/safe_eval.py", line 391, in safe_eval
return unsafe_eval(c, globals_dict, locals_dict)
File "ir.actions.server(1049,)", line 21, in <module>
NameError: name 'requests' is not defined

一开始以为自动化动作不会出现这个问题,但实际不管是定时动作还是自动化动作,都未定义requests模块。推测之前能正常运行的场景是在Odoo.sh或自建Odoo环境中,而我是Odoo Online用户,没有代码访问权限。试过用定时动作触发自动化动作的方案,但未成功,目前考虑用外部API拉取记录再调用Web服务,希望找到更简洁、符合Odoo风格的解决办法。

符合Odoo Online的解决方案

Odoo Online环境无法安装第三方requests库,因此改用Python标准库实现POST请求即可,以下是两种可行方案:

方案一:使用urllib.request

import urllib.request

webhook_url = 'https://xxxxx'

recs = model.search([("x_studio_processed", "=", False)])

for rec in recs:
    # 修正原代码的错误:调用单个记录的字段而非记录集
    data = rec.x_studio_json_text
    data_bytes = data.encode('utf-8')
    
    req = urllib.request.Request(webhook_url, data=data_bytes, method='POST')
    req.add_header('Content-Type', 'application/json')
    
    try:
        urllib.request.urlopen(req)
        # 请求成功后标记记录为已处理,避免重复发送
        rec.write({'x_studio_processed': True})
    except Exception as e:
        # 抛出异常便于排查问题,也可根据需求调整处理逻辑
        raise Warning(f"Webhook请求失败: {str(e)}")

方案二:使用http.client

import http.client
from urllib.parse import urlparse

webhook_url = 'https://xxxxx'
# 拆分URL以获取主机和路径
parsed_url = urlparse(webhook_url)
host = parsed_url.netloc
path = parsed_url.path

recs = model.search([("x_studio_processed", "=", False)])

for rec in recs:
    data = rec.x_studio_json_text
    headers = {'Content-Type': 'application/json'}
    
    conn = http.client.HTTPSConnection(host)
    try:
        conn.request("POST", path, data, headers)
        conn.getresponse()
        rec.write({'x_studio_processed': True})
    except Exception as e:
        raise Warning(f"Webhook请求失败: {str(e)}")
    finally:
        conn.close()

关键注意事项

  • 原代码中recs.x_studio_json_text是错误写法,需改为rec.x_studio_json_text,因为recs是记录集,rec才是单个记录实例
  • 必须设置Content-Type请求头,确保Webhook能正确解析JSON格式的数据
  • 请求成功后标记记录为已处理,避免重复发送相同数据
  • 异常处理逻辑可根据实际需求调整,比如记录日志或跳过错误记录

内容的提问来源于stack exchange,提问作者Gerard ONeill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:30:12