我有以下模型:
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 token
的400 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
感谢