首页 > 其他分享 >Odoo_控制器(controller)常用知识点

Odoo_控制器(controller)常用知识点

时间:2023-12-03 22:36:01浏览次数:31  
标签:知识点 return route request controller Odoo http picking

1.路由的定义

@http.route([
        '/report/<converter>/<reportname>',
        '/report/<converter>/<reportname>/<docids>',
    ], type='http', auth='user', website=True)
def report_routes(self, reportname, docids=None, converter=None, **data):
    report = request.env['ir.actions.report']._get_report_from_name(reportname)

http.route装饰器的参数:

  • type: 指定请求的方式,可选值http和json
  • auth: 认证方式,user,public,none 其中public和none指明用户不需要登录即可访问改URL。
  • website: 是否是网站的URL。

2.获取GET请求的参数

controller获取GET方法传进来的参数,使用reqest.params:

signature = request.params.get("signature",None)
timestamp = request.params.get("timestamp",None)
echostr = request.params.get("echostr",None)
nonce = request.params.get("nonce",None)

3.获取POST请求的数据

controller获取POST方法传进来的原始参数,使用request.httprequest.data:

request.httprequest.data.decode("utf-8")

对于图片等二进制文件,需要在前段form表单中添加属性enctype="multipart/form-data",然后在controller中使用request.httprequest.files属性获取文件。

img1 = request.httprequest.files.get('img')
...
"idnoimg1": b64encode(img1.read())

由于odoo存储二进制的方式为base64编码,因此,我们在拿到二进制文件以后需要使用base64编码存储到系统中。

4.获取JSON数据

当API接口使用json方式传输数据时,controller中获取json数据的方式为:

data = request.jsonrequest.data

5.获取用户的访问ip

获取用户的IP代码如下:

request.httprequest.environ['REMOTE_ADDR']

对于前端挂在了nignx的服务器,Nignx需要配置为转发用户的真实IP:

proxy_set_header Host $host:80;
proxy_set_header Origin "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

然后在odoo中获取nginx的真实IP:

request.httprequest.environ['HTTP_X_REAL_IP']

6.返回404

controller的web服务器用的是werkzeug,因此像redirect、404等返回对象,我们可以利用werkzeug提供的功能来实现。

@http.route('/book_store/raise_404/', auth='public')
def index(self, **kw):
    return werkzeug.exceptions.NotFound()

7.返回500

@http.route('/book_store/raise_500/', auth='public')
def list(self, **kw):
    return werkzeug.exceptions.InternalServerError()

8.跳转其他网摘

    @http.route(_checkout_return_url, type='http', auth='public', csrf=False)
    def stripe_return_from_checkout(self, **data):

        return request.redirect('/payment/status')

9.controller的继承与重载

如果想要对已有的controller进行覆盖,可以通过指定模块路径的方式来实现。

例如,我们现有一个controller

class DeliveryKdn(http.Controller):
@http.route('/delivery_kdn/eorder', auth='public')
def index(picking, id, **kw):

    picking = request.env["stock.picking"].browse(int(id))
    if not picking:
        return

    res = picking._create_eorder(
        picking.partner_id, picking.env.user.partner_id)

    if not res['Success']:
        return request.make_response(f"打印电子面单失败:{res['Reason']}")

    return request.make_response(res['PrintTemplate'])

现在,我们想要对这个controler的代码进行重构,根据不要动既有模块代码的原则,我们新建了一个模块,并继承该模块的controller。

from odoo.addons.delivery_kdniao.controllers.controllers import DeliveryKdn

class controller(DeliveryKdn):

    @http.route('/delivery_kdn/eorder', auth='public')
    def index(picking, id, **kw):
        pass

其实原理是利用的python自带的的子类继承父类,并将覆盖掉父类同名方法的特性。另外,这里需要将两个route的URL设置为一致。

10.参考文献

第三章 控制器 · odoo技术开发白皮书 (odoomommy.com)

标签:知识点,return,route,request,controller,Odoo,http,picking
From: https://www.cnblogs.com/wangdianchao/p/17873931.html

相关文章

  • J组400分 全知识点测评问卷
    是否会手写队列的函数代码如果会请自己手动写一下五个操作的代码inta[1005];inttail=inthead=voidpush(intx){//入队操作}//出队操作//查看队头//查看队尾//查看队列元素个数 ......
  • odoo17.0 快递鸟模块
    快递鸟是国内使用较为广泛的快递集成查询平台之一,提供了600+的物流公司对接接口,是比较不错的物流查询服务选择。随着odoo17.0的发布,我们最近也将快递鸟模块升级到了17.0。下面我们来详细看一下如何使用。注册快递鸟账号要使用快递鸟的查询服务,我们首先需要在快递鸟平台注册一个......
  • Odoo16_Odoo Shell
    OdooShell浅尝-CSDN博客1.启动命令python3odoo-binshell-codoo.conf-ddb0012.内置变量变量类型envodoo.api.Environment 对象odooodoo 模块openerpodoo 模块selfres.users(1,) 记录3.内置方法方法必要参数......
  • odoo 上传与下载附件
    postman上传成功示例:路由地址:/web/binary/upload_attachment获取odoo的cookie和csrf_tokencsrf_token调用方法:request.csrf_token()cookie很难获取,建议重新写路由作者:那时一个人......
  • Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicati
    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅第四章、SpringMVC控制器开发详解二4.1核心要点......
  • Day20.模块的介绍_导入发生三件事_引用强调一_引用强调二_导入多个模块和规范_导入模
    1.模块的介绍:2.首次导入发生的三件事:3.引用强调一:4.引用强调二:5.导入多个模块和导入规范:6.导入模块的其他知识点: ......
  • Spring MVC学习随笔-控制器(Controller)开发详解:接受客户端(Client)请求参数
    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅第三章、SpringMVC控制器开发详解3.1核心要点......
  • 第十四章知识点、完整性总结
    第十四章:MySQL数据库系统本章讨论了MySQL关系数据库系统;介绍了MySQL并指出了它的重要性;展示了如何在Linux机器上安装和运行MySQL;演示了如何使用MySQL在命令模式和批处理模式下使用SQL脚本创建和管理数据库;说明了如何将MySQL与C编程相结合;演示了如何将MySQL与PHP集成,通过动态We......
  • 5分钟掌握接口自动化测试,4个知识点简单易学!
    一.什么是接口测试接口测试是一种软件测试方法,用于验证不同软件组件之间的通信接口是否按预期工作。在接口测试中,测试人员会发送请求并检查接收到的响应,以确保接口在不同场景下都能正常工作。就工具而言,常见的测试工具有Jmeter、Postman等。但这类工具往往更是做接口调试,对于做......
  • JavaScript知识点
    类类(class)是在JS中编写构造函数的新方法。它是使用构造函数的语法糖,在底层中使用仍然是原型和基于原型的继承。模板字符串模板字符串是在JS中创建字符串的一种新方法。我们可以通过使用反引号使模板字符串化。对象解构对象析构是从对象或数组中获取或提取值的—种新的、更简洁的......