【odoo】odoo 公共方法的设计与实现

news2025/1/23 6:27:40

Odoo 公共方法的设计与实现

    • 1. 功能需求
    • 2. seController类分析
      • 2.1 res_ok 方法:返回成功响应
      • 2.2 res_err 方法:返回错误响应
      • 2.3 res_exception 方法:捕获并返回异常
      • 2.4 json_default 方法:自定义 JSON 序列化
      • 2.5 错误码字典 error_code
    • 3. 总结

在 Odoo 开发中,我们常常需要编写一些通用的功能方法,这些方法可以帮助我们更高效地处理数据格式化、错误处理、响应返回等常见的操作。在本篇文章中,我们将介绍一个简单但实用的 Odoo 公共方法类 BaseController,该类提供了常见的 API 响应格式、错误码映射、以及日期/时间序列化的实现。本文将带你逐步了解这些方法的功能和如何在 Odoo 项目中应用它们。

1. 功能需求

在实际开发中,我们常常会面临如下问题:

  1. 返回统一格式的响应数据,无论是成功还是失败。 错误码与错误信息的统一管理,便于后续的维护和修改。
  2. 特殊数据类型(如日期、时间)的处理,确保数据能够正确地转换为 JSON 格式进行传输。
  3. 为了解决这些问题,我们可以通过设计一些通用的基础类来统一这些操作。

下面,我们就来逐一分析BaseController类中的方法。

2. seController类分析

2.1 res_ok 方法:返回成功响应

def res_ok(self, data=None):
    ret = {'code': 0, 'msg': 'success'}
    if data != None:
        ret['data'] = data
    return json.dumps(obj=ret, ensure_ascii=False)

res_ok 方法用于返回一个标准的成功响应。它返回的数据格式为:

{
    "code": 0,
    "msg": "success",
    "data": <optional data>
}
  • code:表示响应的状态码,0表示成功。
    -msg:描述信息,这里是固定的 “success”。
  • data:可选字段,包含请求成功时返回的具体数据。

在 Odoo 中,常常需要处理 API 的响应返回,res_ok 提供了一个非常简洁而标准的返回结构,保证了接口调用者无论成功与否都能按照固定格式处理响应。

2.2 res_err 方法:返回错误响应

def res_err(self, code, data=None):
    ret = {'code': code, 'msg': error_code.get(code) or data}
    if data:
        ret['data'] = data
    return json.dumps(obj=ret, ensure_ascii=False)

res_err方法用于处理错误响应。它接收一个code参数来表示错误类型,并根据错误码映射返回对应的错误信息。如果没有找到错误码对应的描述信息,则返回传入的 data作为错误信息。最终的返回格式为:

{
    "code": <error_code>,
    "msg": <error_message>,
    "data": <optional additional data>
}
  • code:表示错误的类型或编号。
  • msg:错误信息,可以是从 error_code字典中查找的描述信息,或者是自定义的错误信息。
  • data:可选字段,通常用于返回额外的错误数据或详情。

2.3 res_exception 方法:捕获并返回异常

def res_exception(self, err):
    err_object = err.args[0]
    if isinstance(err_object, dict):
        code = err_object['code'] if err_object.get('code', False) else None
    else:
        code = None

    if isinstance(err_object, str):
        msg = err_object or None
    else:
        msg = None

    if code == 610:
        return self.res_err(610)
    else:
        return json.dumps({'code': -1, 'msg': msg}, ensure_ascii=False)

res_exception方法用于捕获异常并返回格式化的错误响应。当发生异常时,它从异常对象中提取错误码和错误信息。如果错误码是 610(session 无效),则直接调用 res_err返回相应的错误信息,否则返回一个默认的错误响应。

这个方法对于处理 Odoo 系统中的异常场景非常有用,尤其是在 API 接口调用过程中经常会遇到的 session过期等问题。

2.4 json_default 方法:自定义 JSON 序列化

def json_default(obj):
    """
    Properly serializes date and datetime objects.
    """
    from odoo import fields
    if isinstance(obj, date):
        if isinstance(obj, datetime):
            return fields.Datetime.to_string(obj)
        return fields.Date.to_string(obj)
    return ustr(obj)

json_default 方法用于将日期和时间对象正确地序列化为 JSON 格式。它首先检查对象是否为 date或 datetime 类型,并使用 Odoo 内置的 fields.Datetime.to_string()fields.Date.to_string()方法将其转化为 ISO 8601 格式的字符串。这样,Odoo 中的日期时间对象可以被正确地传输到前端或外部系统。

2.5 错误码字典 error_code

error_code = {
    -99: '其他异常',
    -6: '登录超时',
    -5: '验证码超时',
    -4: '验证码错误',
    -3: '用户登录过期',
    -2: '用户名或密码不正确',
    0: '接口调用成功',
    400: '域名错误',
    401: '该域名已删除',
    402: '该域名已禁用',
    404: '暂无数据',
    403: '禁止访问',
    405: '错误的请求类型',
    501: '数据库错误',
    502: '并发异常,请重试',
    600: '缺少参数',
    601: '接口调用失败',
    603: '数据查询失败',
    604: '签名错误',
    605: '读取配置参数为空或错误',
    610: 'session无效',
    700: '暂无数据',
    701: '该功能暂未开通',
    702: '资源余额不足',
    903: '验证码超时',
    904: '验证码错误',
    1000: '单据ID不能为空',
    1001: '身份证号码重复',
    1002: '手机号码重复',
    10000: '微信用户未注册'
}

这个 error_code 字典将错误码与对应的错误信息进行映射。通过使用这个字典,我们能够将错误码转换为用户友好的错误信息,提升系统的可维护性和用户体验。新的错误码和错误信息可以很方便地添加到这个字典中,避免了硬编码的方式,增强了代码的可扩展性。

3. 总结

通过 BaseController 类,我们实现了统一的响应格式、错误处理、异常捕获和日期时间的处理。这些方法为开发者提供了非常便利的功能,使得我们能够专注于业务逻辑的实现而不必反复处理常见的基础功能。在 Odoo 的开发过程中,使用这样的公共方法能够有效提高开发效率并降低代码的重复度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【TypeScript】模块化和命名空间、类型查找、类型缩小

模块化和命名空间 ts 在模块化中遵循 esm 规范&#xff0c;而且推荐导入类型时前面加上 type 字段&#xff0c;这些可以让一个非TypeScript编译器比如Babel、swc或者esbuild知道什么样的导入可以被安全移除。 TypeScript有它自己的模块格式&#xff0c;名为namespaces&#x…

城市生命线安全保障:技术应用与策略创新

城市生命线工程是维系城市正常运行、满足群众生产生活需要的重要基础设施。随着城市化进程的加快&#xff0c;城市基础设施生命线安全运行的复杂性日益加剧&#xff0c;保障城市居民日常生活正常运行的水、电、气、热等各类地下管线以及桥梁、市政设施、轨道交通等城市基础设施…

MVCC在MySQL中实现无锁的原理

一&#xff1a;基础知识 我们知道MySQL是多线程并发处理任务的。MySQL使用了MVCC来实现事务并发的无锁机制。 而且我们还需要知道MySQL的四种隔离级别&#xff1a;读未提交&#xff0c;读已提交&#xff08;RC&#xff09;&#xff0c;可重复读&#xff08;RR&#xff09;&am…

WPF实战案例 | C# WPF实现大学选课系统

WPF实战案例 | C# WPF实现大学选课系统 一、设计来源1.1 主界面1.2 登录界面1.3 新增课程界面1.4 修改密码界面 二、效果和源码2.1 界面设计&#xff08;XAML&#xff09;2.2 代码逻辑&#xff08;C#&#xff09; 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&a…

HTML5 Canvas和JavaScript的3D粒子星系效果

HTML部分 基本结构包括<html>, <head>, 和 <body>标签。<title>标签设置了页面标题为“优化版3D粒子星系”。<style>块定义了一些基本样式&#xff1a; body&#xff1a;无边距&#xff0c;隐藏滚动条&#xff0c;黑色背景&#xff0c;禁用触摸…

再见 Crontab!Linux 定时任务的新选择!

引言 说到 Linux 下定时执行任务&#xff0c;大多数人可能会想到 crontab&#xff1f;没错&#xff0c;它的确是 Linux 下比较通用和方便的方式&#xff0c;但是今天我来介绍一种新的方法来创建定时任务并且支持更多更强大的功能。 Systemd 很多小伙伴应该听说过 Systemd&…

Unity入门1

安装之后无法获得许可证&#xff0c;可以考虑重装 新建项目 单击空白处生成脚本 双击c#文件 会自动打开vstudio 检查引用 如果没有引用&#xff0c;重开vstu&#xff0c;或者重新加载项目 hierarchy层级 scenes场景 assets资产 inspector督察 icon图标 资源链接&…

【二叉树】遍历总结!

在很多问题中&#xff0c;熟练掌握二叉树的遍历方法&#xff0c;能够轻松解决很多问题。 新建一棵二叉树root[1,null,2,3] 1、前序遍历 前序遍历的顺序为根节点->左子树->右子树&#xff0c;按照以上二叉树&#xff0c;遍历顺序为[1&#xff0c;2&#xff0c;3]。代码为…

(2)STM32 USB设备开发-USB虚拟串口

例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为USB虚拟串口教程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的USB虚拟串口。本例子是在野火F103MINI开发板上验证的&#xff0c;如果代码中出现一些外设的…

ASP .NET Core 学习(.NET9)部署(一)windows

在windows部署 ASP .NET Core 的时候IIS是不二选择 一、IIS安装 不论是在window7 、w10还是Windows Server&#xff0c;都是十分简单的&#xff0c;下面以Windows10为例 打开控制面版—程序—启用或关闭Windows功能 勾选图中的两项&#xff0c;其中的子项看需求自行勾选&am…

Java并发编程面试题:线程池Fork/Join(19题)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

fyne 选项卡设计

用户界面的设计至关重要&#xff0c;它直接影响着用户体验。选卡设计作为一种常见的界面布局方式&#xff0c;能够有效地组织和展示信息&#xff0c;使用户能够方便快捷地浏览和操作。 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架&#xff0c;它提供了丰富的组件和功能&#…

MySQL——主从同步

提醒&#xff1a;进行配置时&#xff0c;需要确保一主两从的操作系统、MySQL版本一致&#xff0c;否则将出现问题 环境介绍 服务器IP主服务器172.25.254.10从服务器-1172.25.254.11从服务器-2172.25.254.12 配置 # 快速配置&#xff0c;选择多重执行&#xff0c;确保版本一…

IDEA中Maven使用的踩坑与最佳实践

文章目录 IDEA中Maven使用的踩坑与最佳实践一、环境配置类问题1. Maven环境配置2. IDEA中Maven配置建议 二、常见问题与解决方案1. 依赖下载失败2. 依赖冲突解决3. 编译问题修复 三、效率提升技巧1. IDEA Maven Helper插件使用2. 常用Maven命令配置3. 多模块项目配置4. 资源文件…

VIVADO-block desgn 中时钟连线报错

问题描述 1.自定义的IP核由于封装不规范&#xff0c;输出的时钟引脚缺少该时钟的相关信息 正常时钟引脚属性 异常的时钟引脚属性 2.run connection automation 中无法找到这种缺少信息的时钟源 3.axi_clk与axi interconnect时钟频率不匹配 解决方案&#xff1a; 1.用BUFG将缺少…

CSDN 博客之星 2024:默语的技术进阶与社区耕耘之旅

CSDN 博客之星 2024&#xff1a;默语的技术进阶与社区耕耘之旅 &#x1f31f; 默语&#xff0c;是一位在技术分享与社区建设中坚持深耕的博客作者。今年&#xff0c;我有幸再次入围成为 CSDN 博客之星TOP300 的一员&#xff0c;这既是对过往努力的肯定&#xff0c;也是对未来探…

BUUCTF_Web(UPLOAD COURSE 1)

打开靶机&#xff0c;发现需要上传文件&#xff0c;尝试一句话木马蚁剑链接 一句话木马 【基本原理】利用文件上传漏洞&#xff0c;往目标网站中上传一句话木马&#xff0c;然后你就可以在本地通过中国菜刀chopper.exe即可获取和控制整个网站目录。表示后面即使执行错误&#…

车载软件架构 --- CP和AP作为中央计算平台的软件架构双核心

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

docker ubuntu:20.04构建c++ grpc环境

由c grpc必须源码编译&#xff0c;ubuntu版本不同可能出现的问题也不同&#xff0c;这里分享下我的构建过程。 我是vscode结合docker去安装c虚拟环境&#xff0c;我不想污染本机环境。 vscode的插件Dev Containers Dockerfile如下(如果单纯是ubuntu环境构建&#xff0c;可忽略该…

PV-RCNN、PV-RCNN++ 网络结构

paper&#xff1a; PV-RCNN https://arxiv.org/abs/1912.13192PV-RCNN https://arxiv.org/abs/2102.00463 github&#xff1a;使用OpenPCDet进行训练测试 https://github.com/open-mmlab/OpenPCDet PV-RCNN 简介 PV-RCNN的提出是想要综合 point-based 和 voxel-based 3D目…