在Django的Web应用程序,你如何给用户自己的子域名?
我正在使用Django和Pinax开始一个新的Web应用程序项目。 我希望能够给我的用户像Wordpress和其他网站的唯一域名: username.wordpress.com
。 我不知道如何用Django来解决这个问题,因为urlparsing逻辑(在urls.py中)是以域名之后的url开始的。
更具体地说,将会有多个用户组,每个用户组都有一个唯一的名字。 不知道这有什么不同,但我想我应该提到这一点。
有什么办法可以操纵http请求,这样的URL看起来像Django,就好像该url是类似www.domain.com/groupname
,但仍显示在浏览器地址栏作为groupname.domain.com
?
您可以使用一些自定义中间件来拦截请求并从中获取子域。 以下代码将通过反转指定的url来检索子域并redirect到视图。
把它放在你的应用程序中的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'), )
注意:这个代码是未经testing的。
redirect可以改变URL的外观。 如果您想避免这种情况,只需调用相关视图,捕获其结果,然后将其返回到HttpResponse()
。
你需要通过你的networking服务器来处理。 如果你有Djangourl喜欢…
/users/<username>/
…然后在networking服务器中使用重写规则将<username>.domain.com
映射到domain.com/users/<username>/
。
如果你使用Apache,你可以在这里阅读。 否则,每个networking服务器都有自己的约定,但都支持url重写的概念。
请参阅configuration应用服务器的其他备选方法