首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django多租户

Django多租户
EN

Stack Overflow用户
提问于 2015-04-29 08:31:36
回答 1查看 2.4K关注 0票数 2

Tl;dr:有没有办法覆盖reverse的默认行为?

在我的django项目中,我有很多urls,例如

代码语言:javascript
复制
 url(r'^\w+/company/', include("company.urls", namespace="company")),

,它允许使用urls,例如

代码语言:javascript
复制
.../companyA/company/
.../companyB/company/

这样,我就可以使用自定义中间件来修改请求,根据公司使用我的站点的情况包括一些特定的细节。

这一切都很好,除了当django试图用reverse{% url .. %}破译完整的路径时。

它似乎返回/x/company/作为正则表达式的默认匹配。因为django.utils.regex_helper方法next_char有一个转义映射,\w可以映射到x

我能够用正确的公司名称替换url标记覆盖,我想知道是否有类似的事情可以用相同的方式覆盖reverse,或者我可以做什么来解决这个问题?

以前,我用过

代码语言:javascript
复制
url(r'^(?P<company_name>\w+)/company/', include("company.urls", namespace="company"))

但这意味着我必须在每个视图中都包含一个参数。

代码语言:javascript
复制
def view(request, company_name):
    ...

此外,还将它包含在我对视图的所有其他调用中(即使用{% url %}),这是我试图避免的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-09 07:53:51

为了便于使用,Django将包编译成能够实现这一点的包含所有可能存在的django包的页面。然而,下面是我自己的简单实现

我修改了nginx代理配置,以使用以下内容

代码语言:javascript
复制
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中使用。然后,我在自定义中间件中使用这个变量来扩展请求,并引用模型,该模型允许在任何地方使用它。

代码语言:javascript
复制
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

示例:

代码语言:javascript
复制
www.companya.domainurl.com   # short_url is companya
test.domainurl.com           # short_url is test

若要在模板中使用此操作,必须将上下文处理器添加到settings.py中。

代码语言:javascript
复制
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
)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29938338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档