2

私はDjangoとpython全般に慣れていないので、ご容赦ください。DjangoとPythonを使い始めるために、非常にシンプルなSaaSアプリを作成したいと思います。私の設計では、すべてのドメインが同じコードベースで実行されるように指示されています。各Webサイト間で異なるのは、データベース接続の詳細だけです。(つまり、各ドメインは独自のデータベースを受け取ります。すべてのデータベースには同じスキーマが含まれています)

Djangoでこれをどのように処理しますか?Sitesフレームワークを見たことがありますが、それが私が探しているものかどうかはわかりません。基本的に、私はどちらかをしたい

A)ページが読み込まれたときにDjangoにMASTERデータベースからデータベース接続の詳細を検索させ、サイトデータベースに接続するときにそれらの詳細を使用するようにします

B)サイトごとにsettings.pyを用意し、実行時にdjangoに正しいファイルを含めるようにします(IE settings_domain.py)

C)インデックスWSGIに、アクセスするドメインに基づいた適切な設定ファイルを含めるようにします(これは機能するようですが、この実装の潜在的な落とし穴を見逃していると確信しています)

D)私が考えていなかった他のいくつかの実装...

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

4

2 に答える 2

3

さて、 https ://bitbucket.org/uysrc/django-dynamicsites に興味深いプロジェクトがあります。これは、完全にユニークなサイトをすべて同じプロジェクトから実行できるようにしようとします。ただし、現在のところ、提供されている設定よりも少し多くのカスタマイズが必要になるため、あまり効果がないと思います.

私は実際にこれを自分でやったばかりで、最初はdjango-dynamicsitesを使用しようとしましたが、少し扱いが難しく、私のプロジェクトにはあまり適していませんでした. その結果、私は少し異なるアプローチを取ることになりました。

私のプロジェクトには「サイト」モジュールがあり、その中にそれぞれのサイトのモジュールがあります。各モジュールには、独自の settings.py と urls.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

各 settings.py は、おおよそ次のようになります。

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の組み合わせを使用しているので、その構成は大まかに次のようになります:

site1.conf (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 ミドルウェアや、特定のホストをチェックして、それに応じてこの方法またはその方法を実行するようなものがないことです。適切な settings.py ファイルを指す uwsgi、Gunicorn などでそれぞれの Django インスタンスを起動すると、Web サーバーは各サブドメインのリクエストを一致するアップストリーム接続にプロキシします。

于 2012-05-11T20:40:03.373 に答える
0

これを行う最善の方法は、Apache であれ nginx であれ、Web サーバーで書き換え/プロキシを実行することです。Apache では、hosts ファイルを次のように設定して、すべてのドメインをキャッチできます。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>
于 2012-05-11T20:39:07.127 に答える