基于子域的Django应用URL配置
大致想法:
比如说,用户约翰创建了两个页面,网址分别是 /about/ 和 /about/contacts/,他的域名是 john.app.com。用户鲍勃则创建了三个页面,网址是 /company/、/news/ 和 /store/,他的域名是 bob.app.com。所以,如果用户访问 john.app.com,我想加载包含两个网址的方案;而如果用户访问 bob.app.com,我想使用包含三个网址的方案……
我正在使用 django-subdomains 这个工具来为不同的子域名使用不同的网址方案。简单来说,为了实现我的想法,我需要在 Django 开始处理网址模式之前,先获取当前的子域名,并从数据库中获取该子域名可用的页面网址。有没有人知道我该怎么做?
2 个回答
这很简单!
你需要知道,当你用 Apache2 和 mod_wsgi 部署一个网站时,
你会有一个 wsgi.py
文件,在这个文件里你可以找到 settings.py
。
然后在 settings.py
里,你会找到对应的 urls.py
文件。
所以,你可以在项目中使用两个或更多的 settings.py
和 urls.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
好的,我找到了一个解决办法……虽然这个办法不算聪明,但确实有效:
在我的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")