Odoo15 API控制器如何返回简短的500错误响应文本
在Odoo 15 API控制器中返回自定义500错误信息
针对你的需求,有两种可靠的实现方式,解决原生异常冗余和直接返回Response丢失信息的问题:
方法一:构造符合Odoo JSON RPC规范的错误响应
Odoo的API默认遵循JSON RPC格式,直接返回纯字符串会被框架判定为无效响应,导致自定义信息丢失。你需要构造标准的错误结构,确保客户端能正确解析:
import json from odoo import http from odoo.http import request class CustomAPIController(http.Controller): @http.route('/custom/api/action', type='json', auth='public') def custom_api_action(self): # 模拟业务报错场景 try: # 你的业务逻辑代码 raise ValueError("数据验证失败:缺少必填字段") except Exception as e: # 构造标准JSON错误响应 error_payload = { 'jsonrpc': '2.0', 'id': request.jsonrequest.get('id'), 'error': { 'code': 500, 'message': 'Internal Server Error', 'data': str(e) } } return request.Response( json.dumps(error_payload), status=500, content_type='application/json' )
这种方式返回的响应和Odoo原生API格式完全一致,自定义错误信息会放在error.data字段中,不会附带任何堆栈跟踪或冗余文件信息。
方法二:使用Odoo内置的HttpException
Odoo提供了HttpException类,专门用于返回自定义HTTP状态码和错误信息,且默认不会输出堆栈内容(生产环境下):
from odoo import http from odoo.exceptions import HttpException import json class CustomAPIController(http.Controller): @http.route('/custom/api/action', type='json', auth='public') def custom_api_action(self): if some_error_condition: error_data = { 'message': '自定义服务器错误信息' } raise HttpException(request.Response( json.dumps(error_data), status=500, content_type='application/json' )) # 正常业务逻辑返回 return {'result': '操作成功'}
为什么之前的方法失效?
raise Exception():Odoo的默认异常处理会自动附加堆栈跟踪、文件路径等调试信息,这是开发模式下的默认行为,生产环境关闭debug后仍会返回部分冗余内容。- 直接返回
request.Response:若路由类型为type='json',Odoo期望接收JSON格式的返回值,纯字符串会被框架过滤或解析失败,导致自定义信息无法被客户端读取。
内容的提问来源于stack exchange,提问作者Wald Sin
相关产品推荐
相关产品推荐

