django

时间:2016-05-09 19:09:29

标签: django

我想在我的网站上分离一些应用,并在不同的域上移动一些。

但我想避免重写所有模板中的网址。

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:0)

这个想法是重写反向函数(因此,所有url调度的东西)。

然后,您有第一个名为' foo.com '第二个名为' bar.com '

这适用于更多网站而不仅仅是两个

应用/ urls.py

#!/usr/bin/python
# coding: utf-8
from django.conf.urls import include, url
from foo import urls as foo_urls
from bar import urls as bar_urls

url_patterns = [
    url(r'^foo/',
        include(foo_urls),
        namespace='foo'),
    url(r'^bar/',
        include(bar_urls),
        namespace='bar'),
    ]

应用/ __初始化__。PY

#!/usr/bin/python
# coding: utf-8
"""
Just to simplify the multi website thing. Everything is served from one instance
"""
from __future__ import absolute_import
from django.core import urlresolvers
from django.http import Http404

from .settings LANGUAGES


old_reverse = urlresolvers.reverse


def remove_prefix(s, prefix):
    return s[len(prefix):] if s.startswith(prefix) else s


def new_reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None):
    """ Return an url with the domain if the page is situated on another domain
    Note that this works for urls templatetags and for 
    django.core.urlresolvers.reverse, that are used a lot in get_absolute_url()
    methods.
    """
    old_reverse_url = old_reverse(viewname, urlconf, args, kwargs, current_app)
    splitted_url = old_reverse_url.split('/')
    if splitted_url[1] in [L[0] for L in LANGUAGES]:
        (trash, lang, app, *path) = splitted_url
    else:
        (trash, app, *path) = splitted_url
        lang = ''
    if app == 'admin' or current_app == 'admin':
        # fix a case where sometime the reverse has or has not a trailing /
        old_reverse_url = remove_prefix(old_reverse_url, '/')
        # fix a case where sometime the reverse has a double admin at the
        # begining
        old_reverse_url = old_reverse_url.replace('adminadmin', 'admin')
        return '/%s' % old_reverse_url
    path = '/'.join(path)
    if lang ==  '':
        return '//%s.com/%s' % (app, path)
    else:
        return '//%s.com/%s/%s' % (app, lang, path)


urlresolvers.reverse = new_reverse

模板示例

<a href="{% url 'foo:index' %}*>foo index</a>