2

I've got a very simple project running on Django (no models yet) and I need to do the following:

I have created 2 apps, 'Ebony' and 'Ivory' that need to communicate with each other through JSON messages (originally designed to run on different machines but for now one is good enough).

The problem is that the Django Debug server is just one process which runs in a specific port. What I want to do is make each 'App' listen to its own port on the same server and if possible under the same Django project. Is such a scenario possible? And if yes, how should I go about it?

Thanks in advance

4

1 回答 1

12

这是可能的,但不是您将其概念化的方式。Django 应用程序是在给定 Web 服务器上运行的一部分。因此,具有一个或多个应用程序的 Django 项目作为一个 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)。


也就是说,稍后您将需要确定您的两个应用程序是否将共享同一个数据库。如果是这样,请确保两台机器都可以访问它。如果不是,请确保每个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为设置,您可以避免让所有代码访问环境变量,并将设置的逻辑限制为SHARDsettings.py以防您以后想要更改它。如果需要,您的其他 Python 文件可以使用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 'Ebony:index' %}.

于 2014-04-27T15:49:03.650 回答