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配置項的定製--域名決定資料庫