これは可能ですが、あなたがそれを概念化する方法ではありません。Django アプリは、特定の Web サーバーで実行されるものの一部です。したがって、1 つ以上のアプリを持つ Django プロジェクトは、1 つの Web サーバーの一部として実行されます。
解決策は、Django の複数のインスタンスを実行することです。これがデバッグ サーバーでどれだけうまく機能するかはわかりません。ポートを開く場所を示すパラメーターを指定することで、各サーバーを独自のポートで実行できます。次に例を示します。
./manage.py runserver 8000
127.0.0.1:8000 でデバッグ サーバーを実行し、
./manage.py runserver 8080
127.0.0.1:8080 で別のデバッグ サーバーを実行します。通常、これは別のシェルで行われます。
INSTALLED_APPS
これらのいずれかの設定が含まれていることを確認する必要があり'Ebony'
ます'Ivory'
。また、各インスタンスに他のインスタンスへの接続方法を伝える何らかの方法を考え出す必要があります (通常はルート URL を指定することによって)。
とはいえ、後で 2 つのアプリが同じデータベースを共有するかどうかを判断する必要があります。その場合は、両方のマシンがアクセスできることを確認してください。そうでない場合は、DATABASES
値settings.py
がそれぞれ異なることを確認してください。データベースを共有している場合、Django のサイト フレームワークを使用すると、モデル内で物事をまっすぐに保つことができます。
同じプロジェクトから両方を実行するには、どちらを実行するかを Django に指示する必要があります。環境変数を使用することを好みます。これにより、上記のrunserver
コマンドが次のように変更されます。
SHARD=Ebony ./manage.py runserver 8000
と
SHARD=Ivory ./manage.py runserver 8080
あなたのsettings.py
ファイルでは、この変数は からアクセスできますos.environ
。したがって、たとえば、INSTALLED_APPS
シャードごとに異なる値を設定するには、次のように記述します。
SHARD = os.environ["SHARD"]
# Apps common to all shards go here.
LOCAL_APPS = [
commonApp,
]
# Add apps specific to each shard.
if SHARD == "Ebony":
LOCAL_APPS += [
Ebony,
]
elif SHARD == "Ivory":
LOCAL_APPS += [
Ivory,
]
# Add them to the apps that aren't mine.
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.admin',
# ... omitted for brevity ...
'django_extensions',
'south',
'debug_toolbar',
) + LOCAL_APPS
このファイルで を設定として定義することにより、すべてのコードで環境変数にアクセスする必要がなくなり、後で変更する必要がある場合に備えて、SHARD
設定のロジックを に限定できます。他の Python ファイルは、必要に応じて で設定を取得できます。SHARD
settings.py
from django.conf.settings import SHARD
同様のメカニズムを使用して、各シャードに独自のDATABASES
設定を与えることもできます。その他のsettings.py
.
その後、urls.py
ファイルの後半で、それを使用してアプリの URL を取り込みます。
from django.conf.urls import *
from django.conf import settings
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^$', 'commonApp.views.get_homepage', name='home'),
url(r'^login$', 'django.contrib.auth.views.login', name="login"),
url(r'^logout$', 'django.contrib.auth.views.logout',
{"next_page": "/"}, name="logout"),
# Admin
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin/', include(admin.site.urls)),
)
# Auto-add the applications.
for app in settings.LOCAL_APPS:
urlpatterns += patterns('',
url(r'^{0}/'.format(app), include(app + '.urls', namespace=app)),
)
つまり、アプリには独自のurls.py
ファイルが必要であり、アプリの URL 名にはアプリ名のプレフィックスが付けられます。したがって、アプリでを使用Ebony
して URL パターンを定義するとname="index"
、テンプレートで を使用してその URL を取得できます{% url 'Ebony:index' %}
。