[英]Django multi tenancy
; 博士:有沒有辦法覆蓋reverse
的默認行為?
在我的 Django 項目中,我有很多網址,例如
url(r'^\w+/company/', include("company.urls", namespace="company")),
這允許網址,如
.../companyA/company/
.../companyB/company/
這樣我就可以使用自定義中間件來修改請求,以根據使用我的網站的公司來包含一些特定的詳細信息
這一切都很好,除了 django 試圖用reverse
和{% url .. %}
...
它似乎將/x/company/
作為正則表達式的默認匹配項返回。 因為django.utils.regex_helper
方法next_char
有一個轉義映射\\w
映射到x
我已經能夠覆蓋的url
標記將/x/
替換為正確的公司名稱,我想知道是否有類似的事情我可以以相同的方式覆蓋reverse
,或者我可以做的任何其他事情來解決這個問題?
以前,我正在使用
url(r'^(?P<company_name>\w+)/company/', include("company.urls", namespace="company"))
但這意味着我必須在每個視圖中包含一個參數
def view(request, company_name):
...
以及將它包含在我試圖避免的所有其他視圖調用中(即使用{% url %}
)。
為了便於使用,Django 將編譯后的頁面打包,其中包含可以實現此目的的所有可能的現有 django 包。 然而下面是我自己的簡單實現
我修改了我的 nginx 代理配置以使用以下內容
server_name ~(?<short_url>\w+)\.domainurl\.com$;
... stuff related to static files here
location / {
proxy_set_header X-CustomUrl $short_url;
.... other proxy settings
}
這樣做是在請求標頭中創建一個變量,然后可以在 Django 中使用該變量。 然后我在自定義中間件中使用這個變量來擴展請求,並引用模型,允許它在任何地方使用。
class CompanyMiddleware(object):
def process_request(self, request):
if settings.DEBUG:
request.company = CompanyClass.objects.get(id=1)
return None
short_url = request.META.get("HTTP_X_CUSTOMURL")
try:
company = CompanyClass.objects.get(short_url=short_url)
except Model.DoesNotExist:
return HttpResponseBadRequest('Company not found')
request.company = company
return None
例子:
www.companya.domainurl.com # short_url is companya
test.domainurl.com # short_url is test
要在模板中使用它,必須將上下文處理器添加到settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request' # This one in particular
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.