Django在每个端口分别为每个应用程序提供服务

时间:2014-04-27 15:40:44

标签: python django port django-dev-server

我在Django上运行了一个非常简单的项目(还没有型号),我需要做以下事情:

我创建了两个需要通过'Ebony'消息相互通信的应用'Ivory'JSON(最初设计为在不同的计算机上运行,​​但现在一个就足够了) 。

问题是Django Debug服务器只是一个在特定端口运行的进程。我想要做的是让每个'App'在同一台服务器上监听自己的端口,如果可能的话,在同一个Django项目下。这种情况可能吗?如果是的话,我应该怎么做呢?

提前致谢

1 个答案:

答案 0 :(得分:8)

这是可能的,但不是你对其进行概念化的方式。 Django应用程序是在给定Web服务器上运行的应用程序的一部分。因此,具有一个或多个应用程序的Django项目作为一个Web服务器的一部分运行。

解决方案是运行Django的多个实例。不确定这对调试服务器有多好。您可以run each server on its own port给它一个参数,告诉它打开端口的位置,例如:

./manage.py runserver 8000

在127.0.0.1:8000上运行调试服务器,

./manage.py runserver 8080

在127.0.0.1:8080上运行另一个调试服务器。通常这是在单独的shell中完成的。

您需要确保其中一个INSTALLED_APPS设置中包含'Ebony',另一个设置为'Ivory'。您还需要找出一些方法来告诉每个实例如何连接到另一个实例(通常通过指定根URL)。


那就是说,稍后您将需要弄清楚您的两个应用程序是否将共享同一个数据库。如果是这样,请确保两台机器都可以使用它。如果没有,请确保DATABASES中的settings.py值对于每个值都不同。如果您正在共享数据库,Django的sites framework可以帮助您在模型中保持一致。


要同时从同一个项目运行,你必须告诉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定义为此文件中的设置,您可以避免让所有代码访问环境变量,并限制将SHARD设置为settings.py的逻辑,如果你想稍后改变它。如果需要,您的其他Python文件可以使用from django.conf.settings import SHARD进行设置。

也可以使用类似的机制为每个分片提供自己的DATABASES设置。以及settings.py中的任何其他内容。

然后在您的urls.py文件中,您可以使用它来提取您的应用程序'网址:

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文件,并且您的应用网址名称会以您的应用名称为前缀。因此,如果应用Ebony定义了带有name="index"的网址格式,您就可以在包含{% url 'Ebony:index' %}的模板中获取该网址。