基于子域的Django应用URL配置

0 投票
2 回答
749 浏览
提问于 2025-04-18 00:26

大致想法:

比如说,用户约翰创建了两个页面,网址分别是 /about/ 和 /about/contacts/,他的域名是 john.app.com。用户鲍勃则创建了三个页面,网址是 /company/、/news/ 和 /store/,他的域名是 bob.app.com。所以,如果用户访问 john.app.com,我想加载包含两个网址的方案;而如果用户访问 bob.app.com,我想使用包含三个网址的方案……

我正在使用 django-subdomains 这个工具来为不同的子域名使用不同的网址方案。简单来说,为了实现我的想法,我需要在 Django 开始处理网址模式之前,先获取当前的子域名,并从数据库中获取该子域名可用的页面网址。有没有人知道我该怎么做?

2 个回答

0

这很简单!

你需要知道,当你用 Apache2 和 mod_wsgi 部署一个网站时,

你会有一个 wsgi.py 文件,在这个文件里你可以找到 settings.py

然后在 settings.py 里,你会找到对应的 urls.py 文件。

所以,你可以在项目中使用两个或更多的 settings.pyurls.py 文件。

接着,你需要修改你的 Apache 配置文件。

比如说,john.app.com 对应的配置是 john.conf,接着是 john.wsgi.py,之后是 john.settings.py,最后是 john.urls.py。

想了解更多,可以看看这里:http://www.besttome.com/html/run_multiple_websites_one_django_project.html

1

好的,我找到了一个解决办法……虽然这个办法不算聪明,但确实有效:

在我的urls.py文件里,我写了一条规则,接受所有请求,并把它们指向一个叫page_dispatcher的视图:

urlpatterns = patterns('',
   url(r'^$', 'app.account.site.views.page_dispatcher'),
   url(r'^(?P<path>.+)$', 'app.account.site.views.page_dispatcher'),
)

接着,在我的views.py文件里,我创建了动态的URL配置,并使用resolve()函数来找到与请求路径对应的视图:

class DynamicURLConf(object):
    urlpatterns = None

    def __init__(self, pages):
        self.urlpatterns = patterns('',
                                    url(r'^$', 'app.account.site.views.test'),
                                    url(r'^test/$', 'app.account.site.views.test'),
        )


def page_dispatcher(request, path=None):
    if path is None:
        # Here will be a return a homepage view
        return
    func, args, kwargs = resolve(urlparse("/" + path.strip("/") + "/")[2], DynamicURLConf(pages=None))
    kwargs['request'] = request
    return func(*args, **kwargs)


def test(request):
    return HttpResponse("I am test")

撰写回答