如何在Odoo Controller中指定数据库,无需手动选择
在Odoo Controller中指定数据库的正确方法
你之前在@http.route中添加db='test'参数的方式无法直接解决问题,原因是该参数的作用是限定路由仅在指定数据库的上下文内生效,而非自动为请求指定数据库。当请求没有数据库上下文(未手动选择数据库时),Odoo无法匹配到该路由,因此返回404错误。
以下是几种可行的解决方案,可根据你的场景选择:
1. 全局配置默认数据库(最简单)
如果你的Odoo实例默认只需要使用固定数据库,可以直接在配置文件odoo.conf中添加:
db_name = test
启动Odoo后,所有请求都会自动使用该数据库,无需手动选择,你的原路由代码也能直接生效。
2. 在Controller方法内手动切换数据库上下文
如果仅需单个路由指定数据库,可以在方法内手动创建目标数据库的上下文环境:
from odoo import http, registry from odoo.http import request class TestController(http.Controller): @http.route('/test/', type='http', auth='public', website=True) def index(self, **kw): target_db = 'test' # 创建目标数据库的游标与环境 with registry(target_db).cursor() as cr: # 基于公共用户ID创建环境(auth='public'对应uid=public用户ID) env = request.env(cr, request.uid, context=request.context) # 此处可使用env操作目标数据库,例如查询数据 # user_count = env['res.users'].search_count([]) return f"Salutation from database: {target_db}"
注意:需确保auth='public'对应的公共用户在目标数据库中存在且具备必要权限。
3. 通过URL参数指定数据库(临时测试用)
访问路由时直接携带db参数,Odoo会自动识别并切换到对应数据库:
localhost:8069/test/?db=test
这种方式无需修改代码,适合临时验证场景。
4. 自定义中间件实现自动路由匹配数据库
如果需要根据请求路径/域名自动切换数据库,可以通过自定义中间件修改数据库上下文:
from odoo.http import Root from odoo.sql_db import db_connect # 保存原方法引用 original_get_db = Root.get_db def custom_get_db(self, httprequest): # 根据请求路径判断,为/test/路径指定test数据库 if httprequest.path.startswith('/test/'): return 'test' # 其他路径沿用默认逻辑 return original_get_db(self, httprequest) # 替换Root类的get_db方法 Root.get_db = custom_get_db
将这段代码放在模块的__init__.py中,Odoo启动后会自动加载,实现请求路径与数据库的自动绑定。
内容的提问来源于stack exchange,提问作者Jhon
相关产品推荐
相关产品推荐

