【问题标题】:Django - URL template tag breaks with subdomainsDjango - URL 模板标签与子域中断
【发布时间】:2013-05-06 21:02:39
【问题描述】:

我使用自定义中间件将子域映射到应用程序的urls.py,方法是将相关的urls.py 分配给request.urlconf 变量。

除了{% url %} 模板标签之外,这工作正常。
我收到了NoReverseMatch,但不知道为什么。
调试页面显示reverse 函数在view_name 参数中接收到一个值,因此它应该可以工作。

这发生在模板中的每个 {% url %} 标记上。
如果我切换到类似文件夹的网址(例如myproject.com/sub,而不是sub.myproject.com),标签工作正常。

非常感谢任何关于为什么会发生这种情况以及如何解决这个问题的想法。

【问题讨论】:

标签: django-templates subdomain django-1.5


【解决方案1】:

好吧,在没有找到我需要的东西之后,我来到了以下解决方案。 我丢弃了request.urlconf 映射并去重写request.path_info
我在这里发布我的解决方案,以防有人遇到这个问题。

第一步,将以下中间件添加到您的项目中:

class SubdomainMiddleware:
    """Subdomain for Django"""
    def process_request(self, request):
        domain_parts = request.get_host().lower().replace('www.', '').split('.example.com', 1)
        if len(domain_parts) > 1 and domain_parts[0]:
            subdomain = domain_parts[0]
        else:
            subdomain = None

        if subdomain:
            if request.path_info[-1] != '/':
                request.path_info += '/'
            request.path_info = '/%s%s' % (subdomain, request.path_info)

接下来,添加以下代码来覆盖reverse 函数:

from django.conf import settings
from django.core import urlresolvers

_reverse = urlresolvers.reverse

def reverse(*args, **kwargs):
    # In case reversing a full url
    if args[0].startswith('http'):
        return args[0]
    # In case reversing a url name
    if '/' not in args[0]:
        url = _reverse(*args, **kwargs)
    else:
        # In case reversing a url path
        url = args[0]

    parts = url.strip('/').split('/', 1)
    subdomain = parts[0]
    path = parts[1] if len(parts) > 1 else ''
    protocol = 'http://' if settings.DEBUG else 'https://'
    return '%s%s%s/%s' % (protocol, subdomain, '.example.com', path)

urlresolvers.reverse = reverse

我将它放在自定义中间件所在的同一个文件中。

就是这样!

据我所知和测试,一切正常:反转、重定向、模板 {% url %} 标签等。

注意:
我在这段代码中做了三个假设:

  • 域名为example.com。根据需要更改它,将其放在 settings.py 中,任何适合您的地方。
  • 子域映射到子文件夹。例如。 sub.example.com 将转换为 example.com/sub
  • 我的站点在任何地方都使用 SSL。所以我只需检查自定义reverse 函数中的settings.DEBUG 值,看看它是否应该使用httphttps

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 2012-09-10
    • 1970-01-01
    • 2010-09-20
    • 2011-07-11
    • 2011-10-22
    • 2022-11-25
    • 2021-08-31
    • 2011-04-30
    相关资源
    最近更新 更多