如何在Odoo Web控制器中抛出403与404错误?
Odoo Web控制器权限验证与异常抛出实现
一、验证用户权限并抛出403(禁止访问)异常
在Odoo控制器中,你可以通过两种方式实现细粒度权限验证并抛出403异常:
1. 检查模型操作权限
使用check_access_rights方法验证用户对指定模型的操作权限(如读、写、创建、删除),无权限时直接抛出Forbidden异常,或调用Odoo封装的request.access_denied()方法。
示例代码:
import odoo.http as http from odoo.http import request from werkzeug.exceptions import Forbidden class CustomController(http.Controller): @http.route('/my/secure/action', type='http', auth='user') def secure_action(self): # 检查当前用户是否拥有res.partner模型的写权限 partner_model = request.env['res.partner'] if not partner_model.check_access_rights('write', raise_exception=False): # 方式1:抛出Werkzeug标准Forbidden异常 raise Forbidden() # 方式2:调用Odoo内置方法返回403响应 # request.access_denied() # 执行后续业务逻辑 return "操作已执行"
2. 检查用户所属权限组
如果需要验证用户是否属于特定权限组,可通过引用权限组记录并检查用户组关联:
示例代码:
@http.route('/admin/only/action', type='http', auth='user') def admin_only_action(self): # 引用系统管理员权限组 admin_group = request.env.ref('base.group_system') if admin_group not in request.env.user.groups_id: raise Forbidden() # 管理员专属业务逻辑 return "管理员操作完成"
二、抛出404(未找到)异常
当请求的资源(如指定ID的记录)不存在时,可通过两种方式抛出404异常:
1. 使用Werkzeug的NotFound异常
直接抛出NotFound异常,Odoo会自动处理并返回404响应:
示例代码:
from werkzeug.exceptions import NotFound @http.route('/partner/detail/<int:partner_id>', type='http', auth='user') def partner_detail(self, partner_id): partner = request.env['res.partner'].browse(partner_id) if not partner.exists(): raise NotFound() # 返回合作伙伴详情逻辑 return f"合作伙伴名称:{partner.name}"
2. 使用Odoo内置的request.not_found()方法
调用request.not_found()直接返回404响应:
示例代码:
@http.route('/product/detail/<int:product_id>', type='http', auth='user') def product_detail(self, product_id): product = request.env['product.product'].browse(product_id) if not product.exists(): return request.not_found() # 返回产品详情逻辑 return f"产品名称:{product.name}"
内容的提问来源于stack exchange,提问作者Ernesto Ruiz
相关产品推荐
相关产品推荐

