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

Chr*_*lor 35 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

Sov*_*iut 24

您可以使用一些自定义中间件来拦截请求并从中获取子域.以下代码将检索子域并通过反转命名的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)
Run Code Online (Sandbox Code Playgroud)

urls.py

from django.conf.urls.defaults import *

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

注意:此代码未经测试.

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