Django跨站点反向URL

drd*_*man 8 django url reverse templates dry

可能是一个简单的问题,我只是错过了一些东西,但是我的想法很糟糕.

我有Django项目服务于几个具有截然不同sessions.py且完全不同ROOT_URLCONF的网站.一个站点处理用户注册,身份验证和配置文件设置,其他站点(在另一个域上)充当文件管理器等.站点共享相同的数据库,媒体和模板.所有站点都共享相同的用户群,实现了一种透明的单点登录/单点登录机制.它就像一个跨越多个领域的大型网站.

问题是,{% url %}我的模板中有很多标签,当模板在其他网站上使用时,它们不起作用.我想尽可能避免硬编码网址.

例如,在网站A(a.example.org)上我有一个

url('^users/$', 'example.accounts.list_users', name='list_users'),
Run Code Online (Sandbox Code Playgroud)

在A的URLconf中输入.然后,在一些global_menu.html模板中我有{% url list_users %},显然它完美地工作,导致" /users/".

现在,有站点B(b.example.org),与A共享许多内部.为了具有共同的外观,我想global_menu.html在站点B上使用相同的并且想要{% url list_users %}输出" http://a.example.org/users/".我能做到这一点的最好方法是什么?

目前,我正在global_menu.html为每个站点使用单独的,但这违反了DRY原则,并不是很方便.而且,是的,我正在使用Django的contrib.sites框架,为每个站点SITE_ID定义了不同的s settings.py,但实际上还没有在其他任何地方使用它.

更新:目前我正在考虑重新实现url标记或猴子修补reverse(),调用原始版本,并且异常在一些"外部URI列表"中执行额外查找.如果已经存在这样的事情 - 我会很高兴听到.

提前谢谢你的答案!

drd*_*man 12

我已经通过覆盖django.core.urlresolvers.reverse我的自定义函数来实现它:

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

__real_reverse = urlresolvers.reverse

def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None):
    try:
        return __real_reverse(viewname, urlconf, args, kwargs, prefix)
    except urlresolvers.NoReverseMatch, no_match:
        external_urlconfs = getattr(settings, 'EXTERNAL_URLCONFS', [])
        for p, c in external_urlconfs:
            c = urlresolvers.RegexURLResolver(r'^/', c)
            try:
                return p + c.reverse(viewname, *args, **kwargs)
            except urlresolvers.NoReverseMatch:
                pass
        raise no_match

urlresolvers.reverse = reverse
Run Code Online (Sandbox Code Playgroud)

然后列出URLconfs,settings.py如下所示:

ROOT_URLCONF = 'project.urls_a'

EXTERNAL_URLCONFS = (
    ('http://b.example.com/', 'project.urls_b'),
)
Run Code Online (Sandbox Code Playgroud)