繁体   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