2012-02-28 46 views
1

我在我的Django項目中有兩個應用程序:一個面向公衆的應用程序和一個管理應用程序(而不是 django的內置管理站點)。我想要一個域名指向公共站點,另一個域名指向管理站點。 (即,例如,/index.html路由會根據域名指向不同應用中的視圖)。每個應用都有自己的URLconf,它們都被包含在主URLconf中。什麼是最好的方法來做到這一點?Django - 按域名URLConf?

回答

3

有很多方法,這裏有一些可以爲你工作取決於你的具體限制。

  1. 光劈:在HTTP服務器配置黑名單或白名單網址,爲每個域

  2. 猴子補丁網址路由器來檢查request['META']['HTTP_HOST'],因爲它明確不可用的時候正在配置網址

  3. 2 Django實例:使2個設置文件:

    • 讓一個網址,每個站點腳本,

    • 每個域

實例讓每個站點一個設置,這樣

  • 運行一個Django的實例設置文件:

    management_settings.py

    from settings import * 
    ROOT_URLCONF='management_urls.py' 
    

    public_settings.py

    from settings import * 
    ROOT_URLCONF='public_urls.py' 
    

    ,並運行在每一個Django的服務器。不要忘記使用--settings切換管理命令,例如:

    # run public 
    ./manage.py runserver --settings public_settings 
    # run management 
    ./manage.py runserver --settings management_settings 
    
  • 11

    您可以用您自己的主機,中間件

    例如: https://code.djangoproject.com/wiki/MultiHostMiddleware

    settings.py

    HOST_MIDDLEWARE_URLCONF_MAP = { 
        # Control Panel 
        "www.example.com": "webapp.sites.example.urls", 
    } 
    

    multihost.py

    from django.conf import settings 
    from django.utils.cache import patch_vary_headers 
    
    class MultiHostMiddleware: 
    
        def process_request(self, request): 
         try: 
          request.META["LoadingStart"] = time.time() 
          host = request.META["HTTP_HOST"] 
          if host[-3:] == ":80": 
           host = host[:-3] # ignore default port number, if present 
          if settings.HOST_MIDDLEWARE_URLCONF_MAP.has_key(host): 
           request.urlconf = settings.HOST_MIDDLEWARE_URLCONF_MAP[host] 
           request.META["MultiHost"] = str(request.urlconf) 
          else: 
           request.META["MultiHost"] = str(settings.ROOT_URLCONF) 
    
         except KeyError: 
          pass # use default urlconf (settings.ROOT_URLCONF) 
    
        def process_response(self, request, response): 
         if request.META.has_key('MultiHost'): 
          response['MultiHost'] = request.META.get("MultiHost") 
    
         if request.META.has_key('LoadingStart'): 
          _loading_time = time.time() - int(request.META["LoadingStart"]) 
          response['LoadingTime'] = "%.2fs" % (_loading_time,) 
    
         if getattr(request, "urlconf", None): 
          patch_vary_headers(response, ('Host',)) 
         return response