2012-09-04 78 views
0

我想一些簡單的租賃支持添加到應用程序,創建具有字符串「房客」的Account模型從請求URL讀取和識別系統中的租戶:Django的多租戶的URL配置

租戶 .example.com的/ * - > www.example.com/ 租戶/*(由阿帕奇重寫)

我寫了一個簡單的中間件來捕獲此/承租人/從Request的並添加請求.account要處理的對象。

我的問題是我的網址映射。

我嘗試這樣做:

url(r'^(?P<tenant_id>[\w\-]+)/', include('project.urls_tenant')), 

和定義裏面urls_tenant.py一些簡單的網址:

url(r'^app1/', include('project.app1.urls')), 

url(r'^app2/', include('project.app2.urls')), 

當我嘗試訪問任何網頁,我得到一個錯誤信息:

generic_view_method()得到了一個意外的關鍵字參數'tenant_id'

因爲它沒有(實際上不應該)期望tenant_id作爲參數。

如果我硬編碼tenant_idurls.py文件/test_tenant/一切工作正常。

我在做什麼錯誤,以及如何解決它,所以請求和響應得到正常處理?

非常感謝你們。我用這個作爲參考:optimal architecture for multitenant application on django

回答

0

當您顯然不需要時,您正在捕獲URL模式中的named參數tenant_id。嘗試刪除括號避免執行捕獲:

url(r'^[\w\-]+/', include('project.urls_tenant')), 

這個網頁是一個普遍有用讀: https://docs.djangoproject.com/en/dev/topics/http/urls/#how-django-processes-a-request

+0

是的,我認爲會這樣做,但是如何解決'{url url some_named_url%}'生成'具有參數'()'和關鍵字參數'{}'的'some_named_url'的相反問題。「 ?非常感謝你!!! – oak

+1

關閉我的頭頂,2個選項:a)編寫自己的'url'標籤和'reverse'實現; b)擺脫apache重寫,讓你的中間件直接根據主機子域來決定租戶,然後你會發布像/ app1/news/latest /這樣的瀏覽器將根據正確的子域來解析的url。 b)對我來說聽起來更好,但我可能錯過了這個問題。 – Steven

0

如果我理解你正確設置你已經定義:

url(r'^(?P<tenant_id>[\w\-]+)/', include('project.urls_tenant')), 

在我們的主urls.py文件和其他線路在urls_tenant.py文件?

從那裏取出它不會有任何與^(?P [\ w - ] +)/ /通過urls_tenant.py文件傳遞 的請求?您在那裏定義的兩行只能匹配/ app1或/ app2。

但我只是猜測我沒有完全理解你的設置?

我認爲如果您將租戶網址映射到特定視圖而不是包含不同的urls.py文件 (我甚至不知道這是可能的)會更好。

url(r'^(?P<tenant_id>[\w\-]+)/', TenantView.as_view(), name="tenant-view"), 

上面的東西看起來更django給我。

+0

對不起,我沒有得到你的想法,也沒有說明爲什麼是它更喜歡Django的...你建議我在每個網址中加上前綴? – oak