簡體   English   中英

Django 多租戶

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM