我有以下型号:
class LibraryBook(models.Model):
_name = 'library.book'
name = fields.Char('Title', required=True)
date_release = fields.Date("Release Date")
author_ids = fields.Many2many("res.partner", string="Authors")
我是Odoo的新手,并尝试了解如何从POST请求中将数据保存到我的模型的基础知识,如下所示
curl -i -X POST --data "name=Odoo%20-%20Much%20Mystery,%20Wow&author_id=Doge" http://0.0.0.0:8069/test
我找到了一种方法,将控制器中的csrf
参数设置为false
,如下所示:
[...]
@http.route('/test', type='http', auth='public',methods=['POST'], website=True, csrf=False)
def test(self, **kwargs):
record = request.env['library.book'].sudo()
record.create(kwargs)
我现在想知道是否有办法避免设置csrf=false
,因为我已经知道这样做一般来说这是一个坏主意。另外,我还需要摆脱那个.sudo()
?未设置csrf=false
会导致400 BAD REQUEST
与Invalid CSRF token
。删除sudo()
会导致500 INTERNAL SERVER ERROR
。在 Odoo Development Cookbook 中,它在一个示例中用auth='none'
缺少用户也是为什么我们必须在示例代码中对模型方法的所有调用进行sudo()
假设我希望来自API的POST请求,是否可以将其与用户关联,因此我不必sudo()
?
我非常感谢对此的任何澄清。
更新
所以我刚发现this(第817行):
- 如果表单由外部第三方访问(例如REST API端点,支付网关回调),则需要禁用CSRF
保护(并在必要时实施自己的保护) 将csrf=False
参数传递给route
装饰器。
我想只留下一个问题,关于sudo
。
答案 0 :(得分:1)
<强> SUDO()强>
使用提供的用户集创建新环境,如果未提供任何用户,则使用管理员(绕过安全上下文中的访问权限/规则),使用新环境返回调用它的记录集的副本:
Odoo不允许公共用户创建,更新,删除记录。 如果我们想要从公共用户创建记录,那么我们需要使用sudo()创建记录。
以管理员身份创建记录对象
request.env['library.book'].sudo().create(vals)
我希望这对你有帮助。 有关更多信息,您可以导航到以下链接: https://www.odoo.com/documentation/9.0/reference/orm.html
由于