如何从 Odoo Automated Action 导入库

问题描述 投票:0回答:2

我正在尝试通过 Odoo 中的自动操作向服务器发送请求。即,假设创建了一个销售订单。我想将其一些数据发送到服务器并在其他地方处理它。

我使用“执行 Python 代码”选项创建了一个自动操作。当我尝试导入请求库时,出现错误:

"forbidden opcode(s) in 'import requests\n\nprint("test")': IMPORT_NAME"

是否可以通过 Odoo 自动操作导入库?如果不是,可以采取哪些替代方案或解决方法?

这是一张图片以供更多说明:

enter image description here

提前致谢

automation odoo action
2个回答
0
投票

丹尼斯·勒杜

import
确实在自动化/服务器操作中被阻止。

出于安全考虑,这是 Odoo 中预期的:添加它意味着 任何拥有 Odoo 数据库设置访问权限的人都可以 导入任何Python模块,从而做任何他们想做的事情 与您的数据库和服务器文件系统。

例如

import shutil shutil.rmtree('.')  # Deleting all folders and files of current directory

当您的 Odoo 服务器托管多个 数据库:任何数据库的任何管理员都可以执行以下操作 所有其他数据库和文件存储中的任何内容。它不适用于 Odoo.sh,因为每台服务器都是隔离的,并且仅在同一位置托管一个数据库 时间。但是,这种行为是标准 Odoo 服务器的限制, 它可以有多个由服务器托管的数据库,这是 因此,提及这个案例很重要。

为什么不创建一个自定义模块来覆盖

create
以及您想要监控的模型的
write
方法,请联系此 REST API 端点?

  • 这样会更安全,
  • 随着您的业务/定制的增长,它将更好地扩展。事实上,您将使用 Git 的版本控制并了解所做操作的历史记录 出于什么原因,是谁。

如果您仍然希望能够在自动化操作中使用导入, 由于上述原因,这是绝对不建议的,您可以 创建一个覆盖

_SAFE_OPCODES
列表的自定义模块以添加 给定操作码
IMPORT_NAME
https://github.com/odoo/odoo/blob/d7cfa8c502f27bee5c2fccb35db47b08e3b3804b/odoo/tools/safe_eval.py#L95

来源:https://www.odoo.com/de_DE/forum/hilfe-1/how-to-use-import-module-in-automated-action-in-odoo-sh-11-0-136386


0
投票

有一种方法可以做到这一点。过去这可能被认为是不好的做法或不明智的做法。您现在不仅需要添加

_SAFE_OPCODES
,还需要更新
_ALLOWED_MODULES
,否则会抛出导入错误,因为 Odoo 会覆盖
__import__

您仍然需要一个自定义模块来允许此操作,我认为它是安全的。这是允许导入 requests 和 json 模块的示例

#your_module/tools/safe_eval.py
import odoo.tools.safe_eval as safe_eval
from opcode import opmap

safe_eval._SAFE_OPCODES.update(set(opmap[x] for x in ['IMPORT_NAME', 'IMPORT_FROM'] if x in opmap))
safe_eval._ALLOWED_MODULES.extend(['requests', 'json'])

然后,您可以执行“自动操作”>“创建时”>“执行 Python 代码”

import requests, json

headers = {"Content-Type": "application/json", "Accept": "application/json"}
url = "https://webhook.site/1234"
json_data = {'name' : record.name, 'date': record.date.strftime('%Y-%m-%d')}
response = requests.post(url, data=json.dumps(json_data), headers=headers)

关于安全问题:我认为这不应该是一个问题,因为它只允许某些功能或模块。它不允许

shutil
或其他模块......除非你允许。我坚信你应该能够改变这一点,并且不同意丹尼斯·勒杜的观点。覆盖它并安全地继续。

注意: 由于能够执行 Webhook,因此在 Odoo 17+ 中可能不需要此功能。

© www.soinside.com 2019 - 2024. All rights reserved.