2012-02-28 8 views
1

私は私のDjangoプロジェクトに2つのアプリを公開しています:公開アプリと管理アプリ(ではなく、のdjangoの組み込み管理サイト)。パブリックサイトを指すドメイン名と、管理サイトを指す別のドメイン名が必要です。 (つまり、/index.htmlルートは、ドメイン名に応じて別のアプリケーションのビューを指します)。各アプリケーションには独自のURLconfがあり、両方ともメインのURLconfに含まれています。これを行う最善の方法は何ですか?Django-per-domain URLConf?

答えて

3

ここにはさまざまな方法がありますが、具体的な制約に応じていくつかの方法があります。

  1. ライトハック:各ドメインのHTTPサーバー構成でブラックリストやホワイトリストのURL

  2. モンキーパッチそれは時間に決定的に利用できないため、URLのルータは、request['META']['HTTP_HOST']をチェックしますURLが設定されています

  3. 2 Djangoインスタンス:メイク2設定ファイル:

    • 1サイトあたりのスクリプトをURLを確認し、

    • は、ドメイン

例ごとに、このような

  • ラン1つのDjangoのインスタンスとしてサイトごとに1つの設定を行い、ファイルをセッティング:

    management_settings.py

    from settings import * 
    ROOT_URLCONF='management_urls.py' 
    

    public_settings.py

    from settings import * 
    ROOT_URLCONF='public_urls.py' 
    

    そしてそれぞれに1台の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 
    
    関連する問題