You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:12:15