Django笔记 二级子域名配置
2016-04-20 12:28
477 查看
Django,解析二级子域名
1 写一中间件
class SubdomainMiddleware(object):
def process_request(self, request):
domain_parts = request.get_host().split(‘.’)
if len(domain_parts) == 3 and domain_parts[0] != ‘www’:
request.path_info = ‘/%s%s’ % (domain_parts[0], request.path)
2 加入settings.py 的中间件配置里
MIDDLEWARE_CLASSES = (
‘django.middleware.common.CommonMiddleware’,
‘test.base.middlewares.SubdomainMiddleware’,
…}
目前,Django还不支持域名的处理,URL的路由并不考虑host信息,因此对于晒课厅这样的项目,如果想使用二级域名作为学校的区分,就显得有些困难。
于是我们有必要想个办法解决这个问题。一个比较方便的做法是,使用middleware对URL做一些修改,通过一点技巧来让URL的路由“识别”二级域名。不难想到这样处理:
假设我们有两个二级域名需要放在一个Django项目里,分别是:www.shaiketing.com和thu.shaiketing.com,那么为了使用URL的路由,我们需要让路由系统知道我们访问的是www和thu,而路由系统并不关心host信息,所以我们只要让路由系统看到/www/和/thu/就好。因此,我们实际上是把这两个URL变成了www.shaiketing.com/www/和thu.shaiketing.com/thu/,这样路由系统就知道我们访问的是什么二级域名了。
具体怎么做呢?写一个middleware:
通过这样的middleware,我们就可以将二级域名附加到URL路由用到的request.path_info里了。
然而,这样做还会有点问题,reverse的时候并没有host信息,所以我们还需要对reverse做一下处理:
一定要把这段代码加在某个models.py里,加在其他位置都不合适(可以想想为什么?)
现在这个问题应该比较完美的解决了。最后附上urls.py:
https://dangfan.me/zh-Hans/posts/django-subdomain
1 写一中间件
class SubdomainMiddleware(object):
def process_request(self, request):
domain_parts = request.get_host().split(‘.’)
if len(domain_parts) == 3 and domain_parts[0] != ‘www’:
request.path_info = ‘/%s%s’ % (domain_parts[0], request.path)
2 加入settings.py 的中间件配置里
MIDDLEWARE_CLASSES = (
‘django.middleware.common.CommonMiddleware’,
‘test.base.middlewares.SubdomainMiddleware’,
…}
目前,Django还不支持域名的处理,URL的路由并不考虑host信息,因此对于晒课厅这样的项目,如果想使用二级域名作为学校的区分,就显得有些困难。
于是我们有必要想个办法解决这个问题。一个比较方便的做法是,使用middleware对URL做一些修改,通过一点技巧来让URL的路由“识别”二级域名。不难想到这样处理:
假设我们有两个二级域名需要放在一个Django项目里,分别是:www.shaiketing.com和thu.shaiketing.com,那么为了使用URL的路由,我们需要让路由系统知道我们访问的是www和thu,而路由系统并不关心host信息,所以我们只要让路由系统看到/www/和/thu/就好。因此,我们实际上是把这两个URL变成了www.shaiketing.com/www/和thu.shaiketing.com/thu/,这样路由系统就知道我们访问的是什么二级域名了。
具体怎么做呢?写一个middleware:
from django.http import HttpResponsePermanentRedirect class SubdomainMiddleware(object): def process_request(self, request): domain_parts = request.get_host().split('.') if len(domain_parts) == 3: request.path_info = '/%s%s' % (domain_parts[0], request.path) else: return HttpResponsePermanentRedirect('http://www.shaiketing.com') return None
通过这样的middleware,我们就可以将二级域名附加到URL路由用到的request.path_info里了。
然而,这样做还会有点问题,reverse的时候并没有host信息,所以我们还需要对reverse做一下处理:
from django.conf import settings from django.core import urlresolvers def reverse_subdomain(*args, **kwargs): path_info = old_reverse(*args, **kwargs) parts = path_info[1:].split('/', 1) path_info = 'http://%s%s/%s' % ( parts[0], settings.SESSION_COOKIE_DOMAIN, parts[1]) return path_info old_reverse = urlresolvers.reverse urlresolvers.reverse = reverse_subdomain
一定要把这段代码加在某个models.py里,加在其他位置都不合适(可以想想为什么?)
现在这个问题应该比较完美的解决了。最后附上urls.py:
from django.conf.urls.defaults import patterns, include, url urlpatterns = patterns('', url(r'^www/', include('www.urls')), url(r'^thu/', include('thu.urls')), )
参考:
http://my.oschina.net/zuoan001/blog/83521https://dangfan.me/zh-Hans/posts/django-subdomain
相关文章推荐
- ICANN 推迟批准 .Org 交易
- 黑客攻破域名注册商 Web.com 安全防线,客户私密信息或被泄露
- dns。dhcp,ftp
- 提高域名信任度的8个小技巧[推荐]
- .ME域名国内预注册开始
- CEPA 搭桥引路 HK域名直击香港市场
- .tel域名正式开放注册 把握先机赢商机
- Asia域名超30万_收益7000万人民币
- 二级域名原理以及程序
- 注册新网的域名所有出错的代码解说
- 域名DNS解析的故障解决方法
- 新网互联 域名 泛解析设置方法
- CN域名强势发展 稳居全球第一大国家顶级域名
- 如何设置域名接口
- 域名涨价以后,如何修改代理成本价?
- C#域名解析简单实现方法
- 玩转虚拟域名◎+ .
- 注册新网互联的域名所有出错的代码解说
- 域名注册失败的处理办法
- 一个域名查询的程序