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


在 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 的开发过程中,使用这样的公共方法能够有效提高开发效率并降低代码的重复度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值