さて、 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 サーバーは各サブドメインのリクエストを一致するアップストリーム接続にプロキシします。