在django Web应用程序中,如何为用户提供自己的子域?

时间:2009-03-09 02:36:05

标签: django subdomain pinax

我正在使用Django和Pinax开始一个新的Web应用程序项目。我希望能够为我的用户提供Wordpress和其他网站等唯一的域名:username.wordpress.com。我不知道如何使用Django来解决这个问题,因为url解析逻辑(在urls.py中)以域名后的url开头。

更具体地说,将有多组用户,每组具有唯一的名称。不确定这有什么不同,但我想我应该提一下。

我是否可以通过某种方式操作http请求,以便URL看起来像Django,好像网址类似于www.domain.com/groupname,但仍然在浏览器地址栏中显示为groupname.domain.com

3 个答案:

答案 0 :(得分:24)

您可以使用一些自定义中间件拦截请求并从中获取子域。以下代码将检索子域并通过reversing the named url重定向到视图。

将其放入应用中的middleware.py文件中。

确保在settings.py文件中设置中间件。

确保您已在urls.py中命名您的观点

<强> middleware.py

from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
import re

subdomain_pattern = re.compile('(?P<subdomain>.*?)\..*?')

class SubdomainMiddleware(object):
    def process_request(self, request):
        match = subdomain_pattern.match(request.get_host())
        subdomain = match.group('subdomain')
        redirect_url = reverse('groups_detail', args=[subdomain])
        return HttpResponseRedirect(redirect_url)

<强> urls.py

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    url(r'^groups/(?P<name>.+)/$', 'groups.views.detail', {}, name='group_detail'),
)

注意:此代码未经测试。

重定向可以改变URL的外观。如果您想避免这种情况,只需调用关联的视图,捕获其结果,然后将其返回HttpResponse()

答案 1 :(得分:2)

您需要通过网络服务器处理此问题。如果你有像Django的网址...

/users/<username>/

...然后在网络服务器中使用重写规则将<username>.domain.com映射到domain.com/users/<username>/

如果您使用的是Apache,则可以阅读here。否则,每个Web服务器都有自己的约定,但都支持url重写的概念。

答案 2 :(得分:0)

请参阅this其他配置appserver的备选方案