2

Django で実行されている非常に単純なプロジェクト (モデルはまだありません) があり、次のことを行う必要があります。

私は 2 つのアプリを作成'Ebony'しましたが、メッセージ'Ivory'を介して相互に通信する必要がありJSONます (当初は別のマシンで実行するように設計されていましたが、今は 1 つで十分です)。

問題は、DjangoDebugサーバーが特定のポートで実行される 1 つのプロセスにすぎないことです。私がやりたいことは'App'、同じサーバー上で、可能であれば同じ Django プロジェクトの下で、それぞれが独自のポートをリッスンするようにすることです。そのようなシナリオは可能ですか?はいの場合、どうすればよいですか?

前もって感謝します

4

1 に答える 1

12

これは可能ですが、あなたがそれを概念化する方法ではありません。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 つのアプリが同じデータベースを共有するかどうかを判断する必要があります。その場合は、両方のマシンがアクセスできることを確認してください。そうでない場合は、DATABASESsettings.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 ファイルは、必要に応じて で設定を取得できます。SHARDsettings.pyfrom 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' %}

于 2014-04-27T15:49:03.650 に答える