odoo的dbfilter配置项的定制--域名决定数据库

  • 摘要:来自:http://www.oejia.net/blog/2016/03/14/odoo_dbfilter.html概述默认情况下首次访问odoo页面时,会要求选择要访问的数据库,db中的所有库都会被列出来供选择,这种在生产环境下通常是不希望的看到,如果在启动时指定连接的数据库名可以解决这个问题.conf文件中指定db_name=xxx或者启动命令加参数-dxxxdbfilter当我们需要根据域名来匹配数据库时(比如saas环境)这样就不适用了,这个时候就可以用dbfilte
  • 来自:http://www.oejia.net/blog/2016/03/14/odoo_dbfilter.html

    概述

    默认情况下首次访问odoo页面时,会要求选择要访问的数据库,db中的所有库都会被列出来供选择,这种在生产环境下通常是不希望的看到,如果在启动时指定连接的数据库名可以解决这个问题

    .conf文件中指定 db_name = xxx

     

    或者启动命令加参数-d xxx


    dbfilter

    当我们需要根据域名来匹配数据库时(比如saas环境)这样就不适用了,这个时候就可以用 dbfilter 这个配置项来实现

     

    dbfilter 默认值为 .*

     

    eg: dbfilter = ^%h$ 表示按域名精确匹配数据库服务器中名称为域名的数据库

     

    启动参数 --db-filter='^%d$' 表示按二级域名前缀精确匹配对应名称的数据库(注意:127.0.0.1访问时会被匹配为 127 库名)

     

    可用的匹配替代符号有 %h 和 %d


    %h

    %h 代表访问访问的域名,比如 www.abc.com


    %d

    当访问地址为 www.abc.com 时 %d 为 abc
    当访问地址为 shop.abc.com 时 %d 为 shop


    相关源代码

    odoo中的相应的解析代码


    def db_filter(dbs, httprequest=None):httprequest = httprequest or request.httprequesth = httprequest.environ.get('HTTP_HOST', '').split(':')[0]d, _, r = h.partition('.')if d == "www" and r: d = r.partition('.')[0]r = openerp.tools.config['dbfilter'].replace('%h', h).replace('%d', d)dbs = [i for i in dbs if re.match(r, i)]return dbs
    扩展

    笔者由于在saas环境的需求扩展了两个配置参数用于控制访问的路由以及域名绑定


    dbhost = xxx.com
    dbhost 用于控制针对哪个域名做二级域名的路由dbmap = dbmap.json
    dbmap 指定的json文件中指明了具体映射路由表及域名绑定关系
    dbmap.json 配置方法
    {“二级子域名”: [“绑定的外部域名”, “数据库名”], …}
    示例:
    {"test": ["www.test.com", "test.odoo.com"],"odoo": ["","odoo-server"]//访问域名:www.odoo.com"abc": ["","abc-server"]//访问域名:abc.odoo.com}

    如果不想列出所有 db 则在 .conf 中添加 dbfilter = ^%h$

     

    实现的关键代码如下:


    def db_filter(dbs, httprequest=None):httprequest = httprequest or request.httprequesth = httprequest.environ.get('HTTP_HOST', '').split(':')[0]d, _, r = h.partition('.')rg = '^$'m_config = openerp.tools.configif r in m_config['dbhost']: if d == "www" and r: d = r.partition('.')[0] rg = m_config['dbfilter'].replace('%h', h).replace('%d', d) if d in m_config['ukey_dbname']: rg = '^%s$'%m_config['ukey_dbname'][d]else: if h in m_config['host_ukey']: ukey = m_config['host_ukey'][h] if ukey in m_config['ukey_dbname']:rg = '^%s$'%m_config['ukey_dbname'][ukey] else:rg = '^%s$'%ukeyelse: rg = '^$'dbs = [i for i in dbs if re.match(rg, i)]return dbs

    另外这里还有一个一级域名的例子:

     

    http://shine-it.net/index.php?topic=16199.0

     

    不同库,客户使用时不能看到其它人使用的库,
    我感觉这个功能应该在多个库时比较有多,当前分享一下做法
    1.有两个域名分别是a.openerp.comb.openerp.com
    2.当使用a.openerp.com时,访问数据库A ,当使用b.openerp.com时,使用数据库B
    3.找到函数:/addons/web/controllers/main.py 下的db_list函数,在函数修改为: ####中为添加的代码
    def db_list(req, force=False):
    proxy = req.session.proxy("db")
    dbs = proxy.list(force)
    h = req.httprequest.environ['HTTP_HOST'].split(':')[0]
    ####################
    onedb=openerp.tools.config.get(h+'_db',False)
    if onedb!=False:
    return [onedb]
    ####################
    d = h.split('.')[0]
    r = openerp.tools.config['dbfilter'].replace('%h', h).replace('%d', d)
    dbs = [i for i in dbs if re.match(r, i)]
    return dbs
    4.可以看到,它读取了config中的内容,所以你需要在openerp-server.conf中添加配置:
    a.openerp.com_db=A
    b.openerp.com_db=B
    5.完成说明:以前代码不影响正常使用,如果配置文件中没有写相应的数据库,则会按照老方法显示页面,但如要已经配置数据库,那么登录页面中将不会显示数据库选择,强制和已设置的数据库。加入ODOO8的方式,修改的代码文件位置是:D:/GreenOdoo/source/openerp/http.py修改源码为:def db_filter(dbs, httprequest=None):
    httprequest = httprequest or request.httprequest
    h = httprequest.environ.get('HTTP_HOST', '').split(':')[0]
    d, _, r = h.partition('.')
    ##开始进行替换=========
    if r=='':#只有一级域名
    d='www'
    r=openerp.tools.config.get(d+'_db',dbs)
    ##替换结束=============
    ##原始内容
    #if d == "www" and r:
    #d = r.partition('.')[0]
    #r = openerp.tools.config['dbfilter'].replace('%h', h).replace('%d', d)
    ##原始内容结束
    dbs = [i for i in dbs if re.match(r, i)]
    return dbs

  • 以上是odoo的dbfilter配置项的定制--域名决定数据库

猜你喜欢

转载自blog.csdn.net/weixin_40997205/article/details/83617176