Django多租户

3

Tl; dr: 是否有一种方法可以覆盖 reverse 的默认行为?

在我的 Django 项目中,我有很多像这样的 url:

 url(r'^\w+/company/', include("company.urls", namespace="company")),

这允许使用类似的URL

.../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 %}来包含它,与其他调用相关。(这里的内容涉及IT技术)


2
你正在尝试实现多租户功能。解决这个问题有几种方法(覆盖反向不是其中之一)。请参考此链接 - undefined
@BurhanKhalid - 我看了链接中建议的一个包,实际上他们确实重写了反向解析,尽管他们的方法是基于设置返回不同的 URL,但我希望有一种更动态的方式(老实说,我不认为这是可能的)。 - undefined
1个回答

9
为了方便使用,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
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接