2012-05-11 18 views
2

私はDjangoとPythonには一般的なので、私に同行してください。私はDjangoとPythonを使い始めるための非常にシンプルなSaaSアプリケーションを作りたいと思っています。私の設計では、すべてのドメインが同じコードベース上で動作するように指示されています。各Webサイトで異なる唯一のものは、データベース接続の詳細です。 (各ドメインは独自のデータベースを受け取ります。すべてのデータベースに同じスキーマがあります)1つのDjangoプロジェクトで複数のドメインホスティング

これについてDjangoでどうやってやりますか?私はサイトのフレームワークを見たことがありますが、私はそれが私が探しているものではないと思います。基本的に、私はどちらかしたいと思います

A)は、Djangoは、ページのロード時、MASTERデータベースからデータベース接続の詳細を検索し、サイトデータベース

Bに接続する際にこれらの詳細を使用して持っている)がありますサイトごとにsettings.pyを設定し、djangoに実行時に適切なファイルを含める(IE settings_domain.py)

C)インデックスWSGIにアクセスするドメインに基づいて適切な設定ファイルを含めるようにしてください私はこの実装の潜在的な落とし穴がないと確信しています)

D)いくつかの他のimp私は考えていませんでした....

私はこれが必要以上に複雑になっていますか?どうすればこの機能を新しいdjangoプロジェクトに簡単に実装できますか?

答えて

0

これを行う最善の方法は、Apacheまたはnginxであるかどうかにかかわらず、Webサーバー上で書き換え/プロキシを行うことです。 apacheでは、ホストファイルをこのように設定して、すべてのドメインを捕まえることができます。 djangoはURLを取得して、どのドメインかを判断できます。

<VirtualHost *:80> 
    ServerName domain.com 
    ServerAlias * 
    DocumentRoot /var/www/domain.com/DjangoProj/public 

    Alias /media/ /var/www/domain.com/DjangoProj/misc/media/ 
    Alias /static/ /var/www/domain.com/DjangoProj/misc/static/ 

    <Directory /var/www/domain.com/DjangoProj/public> 
     Order deny,allow 
     Allow from all 
    </Directory> 

    WSGIScriptAlias//var/www/domain.com/DjangoProj/app/wsgi.py 

    <Directory /var/www/domain.com/DjangoProj/app> 
    <Files wsgi.py> 
    Order deny,allow 
    Allow from all 
    </Files> 
    </Directory> 

    <IfModule mod_rewrite.c> 
      RewriteEngine on 
      RewriteCond %{HTTP_HOST} ^(.*) [NC] # Catch domain 
      RewriteCond %{REQUEST_URI} !userdomain [NC] # Don't rewrite if we already have it 
      RewriteRule ^(.*)$ /userdomain/%1$1 [PT,L] # Pass in PT to give the URL back to mod_python! 
    </IfModule> 

    ErrorLog /var/www/domain.com/logs/error.log 
    CustomLog /var/www/domain.com/logs/access.log combined 
</VirtualHost> 
+0

この設定では、mod_pythonとapache2を使用します。しかし、このアイデアは他のWebサーバー構成に変換されます – pyramation

+0

この構成では、異なるフォルダ構造を持たずにサイトを動的に追加することができます。新しいPythonファイルを設定しなくても、ユーザーはフレームワークにWebサイトを追加できます。例えば'someuser.com' =>' yourdomain.com/userdomain/someuser.com'です。あなたはあなたのurlconfなどのカスタムをすべて実行して好きなものを実行します – pyramation

+0

これは私が思っていたのと同じように聞こえますが、完全に理解できません(PythonとDjangoには全く新しい) 私はドメインをキャッチしてwsgiに送信することを理解していますが、Python側で正しいsettings.pyファイルを含めるにはどうしたらよいかわかりません/ドメインの正しいデータベースに接続してください。 私は、どのドメインが呼び出されたかによって、独自のsettings.pyをロードすることを考えました。各settings.pyはそのドメインに固有のデータベース接続の詳細を持っています。あなたのアイデアは同じように聞こえますが、私はそれを完成させて機能させる方法がわかりません。ありがとう! – Kevin

3

まあ、興味深いプロジェクトはhttps://bitbucket.org/uysrc/django-dynamicsitesです。これは、すべてが同じプロジェクトを実行している完全にユニークなサイトを持つようにしようとします。しかし、現時点では、設定よりもさらにカスタマイズしなければならないので、私はあなたにはあまり効果がないと思っています。

私は実際にこれを自分でやっていましたが、もともとはdjango-dynamicsitesを使用しようとしましたが、私のプロジェクトではそれほど気に入らず、正しくはありませんでした。その結果、少し違ったアプローチをとった。

私のプロジェクトには「サイト」モジュールがあり、そのサイトにはそれぞれ固有のサイト用のモジュールがあります。各モジュールには独自のsettings.pyとurls.pyとtemplatesディレクトリがあります。各settings.pyは、おおよそ次のようになります

sites 
    - __init__.py 
    - site1 
     - __init__.py 
     - settings.py 
     - urls.py 
     - templates 
      - base.html 
    - site 2 
     - __init__.py 
     - settings.py 
     - urls.py 
     - templates 
      - base.html 

:たとえばだから、

from myproject.settings import * 

SITE_ID = 1 
URL_CONF = 'sites.site1.urls' 

SITE_ROOT = os.path.dirname(__file__) 
TEMPLATE_DIRS = (
    os.path.join(SITE_ROOT, 'templates') 
) 

CACHE_MIDDLEWARE_KEY_PREFIX = 'site1' 

、何これが行うことは、プロジェクトの設定ファイルをインポートし、サイトに固有の設定を上書きします。それから、あなたがしなければならないことは、あなたが使用しているサーバがメインのプロジェクトsettings.pyではなく、特定のサイトのsettings.pyをロードしていることを確認することだけです。私はnginx + Gunicornのコンボを使用していますので、ここでその設定がどのようになっているかを大まかに説明します:

site1CONF(nginxの)

upstream site1 { 
    server 127.0.0.1:8001 fail_timeout=0; 
} 

server { 
    listen 80; 
    server_name site1.domain.com; 

    root /path/to/project/root; 

    location/{ 
     try_files $uri @proxy; 
    } 

    location @proxy { 
     proxy_pass_header Server; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Scheme $scheme; 
     proxy_connect_timeout 10; 
     proxy_read_timeout 30; 
     proxy_pass http://site1; 
     proxy_redirect off; 
    } 

} 

私はGunicornサーバを管理するスーパーバイザーを使用するには、ので、ここでそのために私の設定です:

site1.conf(スーパーバイザー)

[program:site1] 
command=/path/to/virtualenv/bin/python manage.py run_gunicorn --settings=sites.site1.settings 
directory=/path/to/project/root 
user=www-data 
autostart=true 
autorestart=true 
redirect_stderr=True 

重要な部分派手なDjangoミドルウェアやそのような特定のホストのチェックがなく、それに応じてそれが行われるということです。 uhsgi、GunicornなどのDjangoインスタンスを適切なsettings.pyファイルに書き込むと、Webサーバーは各サブドメインの要求を一致するアップストリーム接続にプロキシします。

関連する問題