安裝了一個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玩耍了。