35

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

更具体地说,将有多个用户组,每个组都有一个唯一的名称。不确定这会有所不同,但我想我应该提到这一点。

有什么方法可以操纵 http 请求,使 URL 在 Django 中看起来就像 url 一样www.domain.com/groupname,但仍显示在浏览器地址栏中groupname.domain.com

4

2 回答 2

24

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

将它放在应用程序的 middleware.py 文件中。

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

确保您已在 urls.py 中命名您的视图

中间件.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)

网址.py

from django.conf.urls.defaults import *

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

注意:此代码未经测试。

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

于 2009-03-09T03:09:04.703 回答
2

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

/users/<username>/

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

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

于 2009-03-09T02:56:28.447 回答