odoo支持dbfilter配置用于实现多域名对应多账套,dbfilter是一个python标准正则字符串,并支持特殊的%h、%d这两个动态参数
根据源代码剖析(odoo8、odoo9)
openerp/http.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def db_filter(dbs, httprequest=None): httprequest = httprequest or request.httprequest #请求域名去除端口号,如果有的话 h = httprequest.environ.get('HTTP_HOST', '').split(':')[0] #分割域名取主机名,即多级域名最左边段 d, _, r = h.partition('.') #如主机名为www且有下一段取第二段为主机名 if d == "www" and r: d = r.partition('.')[0] #动态正则支持,%h替换为域名,%d替换为主机名 r = openerp.tools.config['dbfilter'].replace('%h', h).replace('%d', d) #正则筛选匹配的数据库列表 dbs = [i for i in dbs if re.match(r, i)] return dbs |
由此可见,绝大部分有规律的映射需求都可以得到满足。惟有那些情况特殊,完全没有规则可言的:比如SEO需要、历史数据库命名混乱、甚至多个一级域名只对一个数据库的需求就悲剧了
这里举一个理想的openerp-server.conf扩展配置特例
1 2 3 4 5 6 7 8 9 10 11 |
dbfilter = %m dbfilter_zhunlian.net = www-zhunlian-net dbfilter_www.zhunlian.net = www-zhunlian-net dbfilter_wap.zhunlian.net = www-zhunlian-net dbfilter_higk.com = www-higk-com dbfilter_www.higk.com = www-higk-com dbfilter_wap.higk.com = www-higk-com dbfilter_higk.com.cn = www-higk-com dbfilter_www.higk.com.cn = www-higk-com dbfilter_higk.net = www-higk-com dbfilter_www.higk.net = www-higk-com |
首先新增支持%m特别参数,用来开启域名数据库映射复杂模式
其次新增支持dbfilter_前缀的域名映射独立配置指定数据库名称(www-zhunlian-net、www-higk-com)
最后迫不得已新增插入两行精炼的源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def db_filter(dbs, httprequest=None): httprequest = httprequest or request.httprequest h = 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) #开启域名数据库映射复杂模式 if r == '%m': #尝试获取域名独立配置,如无指定则映射同名数据库名,相当于保底%h功能以减少标准配置 r = openerp.tools.config.get('dbfilter_%s' % h, h) dbs = [i for i in dbs if re.match(r, i)] return dbs |
注:一个域名必备的.号在正则表达式领域可用于匹配任意字符,所以域名全称作为正则也可以根据需要匹配出一组数据库列表,如域名renjie.me可同时匹配出数据库名为renjie.me、renjie-me、renjie@me等等相似名称的数据库