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. 功能需求
在实际开发中,我们常常会面临如下问题:
- 返回统一格式的响应数据,无论是成功还是失败。 错误码与错误信息的统一管理,便于后续的维护和修改。
- 特殊数据类型(如日期、时间)的处理,确保数据能够正确地转换为 JSON 格式进行传输。
- 为了解决这些问题,我们可以通过设计一些通用的基础类来统一这些操作。
下面,我们就来逐一分析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
的开发过程中,使用这样的公共方法能够有效提高开发效率并降低代码的重复度。