从POST请求向模型写入数据(Odoo 9.0)



我有以下模型:

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导致具有Invalid CSRF token400 BAD REQUEST。移除sudo()导致500 INTERNAL SERVER ERROR。在Odoo Development Cookbook中,有一个例子中提到了auth='none'

缺少用户也是我们必须sudo()所有对示例代码中建模方法的调用的原因

假设我期望来自API的POST请求,是否可以将其与用户关联,这样我就不必sudo()了?

我非常感谢对此作出任何澄清。

更新

所以我刚刚发现了这个(817行):

  • 如果表单被外部第三方访问(例如REST API端点、支付网关回调),则需要通过
    csrf=False参数传递给route装饰器来禁用CSRF
    保护(并在必要时实现您自己的保护)

我想这只留下一个问题,关于sudo

SUDO()

使用提供的用户集创建一个新环境,如果没有提供,则使用管理员(以绕过安全上下文中的访问权限/规则),返回使用新环境调用的记录集的副本:

Odoo不允许公共用户创建、更新或删除记录。如果我们想从公共用户创建一个记录,那么我们需要使用sudo()创建一个纪录。

以管理员身份创建记录对象

request.env['library.book'].sudo().create(vals)

我希望这能对你有所帮助。有关详细信息,您可以导航到以下链接:https://www.odoo.com/documentation/9.0/reference/orm.html

感谢

最新更新