我正在使用Django和Pinax开始一个新的Web应用程序项目。我希望能够为我的用户提供Wordpress和其他网站等唯一的域名:username.wordpress.com
。我不知道如何使用Django来解决这个问题,因为url解析逻辑(在urls.py中)以域名后的url开头。
更具体地说,将有多组用户,每组具有唯一的名称。不确定这有什么不同,但我想我应该提一下。
我是否可以通过某种方式操作http请求,以便URL看起来像Django,好像网址类似于www.domain.com/groupname
,但仍然在浏览器地址栏中显示为groupname.domain.com
?
答案 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的备选方案