我正在尝试通过 Odoo 中的自动操作向服务器发送请求。即,假设创建了一个销售订单。我想将其一些数据发送到服务器并在其他地方处理它。
我使用“执行 Python 代码”选项创建了一个自动操作。当我尝试导入请求库时,出现错误:
"forbidden opcode(s) in 'import requests\n\nprint("test")': IMPORT_NAME"
是否可以通过 Odoo 自动操作导入库?如果不是,可以采取哪些替代方案或解决方法?
这是一张图片以供更多说明:
提前致谢
丹尼斯·勒杜:
确实在自动化/服务器操作中被阻止。import
出于安全考虑,这是 Odoo 中预期的:添加它意味着 任何拥有 Odoo 数据库设置访问权限的人都可以 导入任何Python模块,从而做任何他们想做的事情 与您的数据库和服务器文件系统。
例如
import shutil shutil.rmtree('.') # Deleting all folders and files of current directory
当您的 Odoo 服务器托管多个 数据库:任何数据库的任何管理员都可以执行以下操作 所有其他数据库和文件存储中的任何内容。它不适用于 Odoo.sh,因为每台服务器都是隔离的,并且仅在同一位置托管一个数据库 时间。但是,这种行为是标准 Odoo 服务器的限制, 它可以有多个由服务器托管的数据库,这是 因此,提及这个案例很重要。
为什么不创建一个自定义模块来覆盖
以及您想要监控的模型的create
方法,请联系此 REST API 端点?write
- 这样会更安全,
- 随着您的业务/定制的增长,它将更好地扩展。事实上,您将使用 Git 的版本控制并了解所做操作的历史记录 出于什么原因,是谁。
如果您仍然希望能够在自动化操作中使用导入, 由于上述原因,这是绝对不建议的,您可以 创建一个覆盖
列表的自定义模块以添加 给定操作码_SAFE_OPCODES
。 https://github.com/odoo/odoo/blob/d7cfa8c502f27bee5c2fccb35db47b08e3b3804b/odoo/tools/safe_eval.py#L95IMPORT_NAME
有一种方法可以做到这一点。过去这可能被认为是不好的做法或不明智的做法。您现在不仅需要添加
_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+ 中可能不需要此功能。