odoo的dbfilter配置項的定製--域名決定數據庫

來自:http://www.oejia.net/blog/2016/03/14/odoo_dbfilter.html

概述

默認情況下首次訪問odoo頁面時,會要求選擇要訪問的數據庫,db中的所有庫都會被列出來供選擇,這種在生產環境下通常是不希望的看到,如果在啓動時指定連接的數據庫名可以解決這個問題

  1. .conf文件中指定 db_name = xxx

  2. 或者啓動命令加參數-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中的相應的解析代碼

  1. def db_filter(dbs, httprequest=None):
  2. httprequest = httprequest or request.httprequest
  3. h = httprequest.environ.get('HTTP_HOST', '').split(':')[0]
  4. d, _, r = h.partition('.')
  5. if d == "www" and r:
  6. d = r.partition('.')[0]
  7. r = openerp.tools.config['dbfilter'].replace('%h', h).replace('%d', d)
  8. dbs = [i for i in dbs if re.match(r, i)]
  9. return dbs

擴展

筆者由於在saas環境的需求擴展了兩個配置參數用於控制訪問的路由以及域名綁定

  • dbhost = xxx.com
    dbhost 用於控制針對哪個域名做二級域名的路由
  • dbmap = dbmap.json
    dbmap 指定的json文件中指明瞭具體映射路由表及域名綁定關係
    dbmap.json 配置方法
    {“二級子域名”: [“綁定的外部域名”, “數據庫名”], …}
    示例:
    1. {
    2. "test": ["www.test.com", "test.odoo.com"],
    3. "odoo": ["","odoo-server"] //訪問域名:www.odoo.com
    4. "abc": ["","abc-server"] //訪問域名:abc.odoo.com
    5. }

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

實現的關鍵代碼如下:

  1. def db_filter(dbs, httprequest=None):
  2. httprequest = httprequest or request.httprequest
  3. h = httprequest.environ.get('HTTP_HOST', '').split(':')[0]
  4. d, _, r = h.partition('.')
  5. rg = '^$'
  6. m_config = openerp.tools.config
  7. if r in m_config['dbhost']:
  8. if d == "www" and r:
  9. d = r.partition('.')[0]
  10. rg = m_config['dbfilter'].replace('%h', h).replace('%d', d)
  11. if d in m_config['ukey_dbname']:
  12. rg = '^%s$'%m_config['ukey_dbname'][d]
  13. else:
  14. if h in m_config['host_ukey']:
  15. ukey = m_config['host_ukey'][h]
  16. if ukey in m_config['ukey_dbname']:
  17. rg = '^%s$'%m_config['ukey_dbname'][ukey]
  18. else:
  19. rg = '^%s$'%ukey
  20. else:
  21. rg = '^$'
  22. dbs = [i for i in dbs if re.match(rg, i)]
  23. return dbs


另外這裏還有一個一級域名的例子:

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

不同庫,客戶使用時不能看到其它人使用的庫,
我感覺這個功能應該在多個庫時比較有多,當前分享一下做法
1.有兩個域名分別是    a.openerp.com     b.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

發佈了245 篇原創文章 · 獲贊 357 · 訪問量 268萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章