天天看點

ODOO中通過域名來自動選擇資料庫

安裝了一個odoo8的測試環境,給不同的客戶建立了不同的資料庫,為了不讓客戶通路時看到其它資料庫選擇,需要把選擇資料庫的功能隐藏起來。每個客戶配置設定一個域名,用不同的域名來自動關聯資料庫。

在之前openerp7應用中,有人提到了通過修改源碼的方式來實作,但實際體驗不太好,後來看了odoo8中的代碼,實際上系統本身就已經提供了類似的功能。

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)  

    dbs = [i for i in dbs if re.match(r, i)]  

    return dbs  

從以上代碼可以看出,在過濾資料庫名稱時,系統提供了兩個變量(%h,%d),%h是域名,%d是二級域名,如果二級域名是www,則%d是域名中間的部分。是以我們可以通過設計參數檔案中dbfilter的内容來達到通過域名自動選擇資料庫的目的。

我把參數檔案中的dbfilter=.*改為了dbfilter=^%d$,表示資料庫的名稱就是二級域名名稱。然後我在浏覽器中輸入http://db1.xxx.cn ,系統并沒直接跳到db1資料庫,而是進入到了初始的建立資料庫頁面。額,是咋回事呢?

通過調試,發現上面函數中的h并不是輸入的db1.xxx.cn,而是odoo8,真是奇了怪了。看起來odoo8比較面熟,想到跟nginx中的某個名稱相同。因為我安裝了nginx進行反向代理,把所有80端口的通路重定向到了8069端口,主要參數配置如下:

upstream odoo8 {  

server 127.0.0.1:8069;  

}  

upstream odoo8-im {  

server 127.0.0.1:8072;  

server {  

listen 80;  

server_name _;  

add_header strict-transport-security max-age=2592000;  

location / {  

proxy_pass http://odoo8;  

location /longpolling {  

proxy_pass http://odoo8-im;  

location /web/static/ {  

proxy_cache_valid 200 60m;  

proxy_buffering on;  

expires 864000;  

這裡可以看出來,因為用了nginx進行反向代理,在轉到8069端口時使用了http://odoo8,是以odoo中取得的域名變成了odoo8,這個問題怎麼辦?想了想看能不能在nginx方面調整配置,将用戶端的域名傳導到odoo中,看來我們遇到的問題nginx都已經幫我們想到了,通過查詢相關資料,将nginx參數調整為如下内容:

proxy_set_header host $http_host;  

proxy_set_header x-forward-for $remote_addr;  

proxy_set_header x-real-ip $remote_addr;  

增加了proxy_set_header的設定,重新啟動nginx,在浏覽器輸入http://db1.xxx.cn,odoo就進入了db1資料庫,輸入http://db2.xxx.cn,系統就進入了db2。

現在終于可以愉快滴跟odoo玩耍了。