Django在每个its p中分别为每个应用程序提供服务

2024-05-19 00:01:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django上运行了一个非常简单的项目(还没有模型),我需要执行以下操作:

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

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

提前谢谢


Tags: 项目django端口模型服务器机器jsonapp
1条回答
网友
1楼 · 发布于 2024-05-19 00:01:21

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

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

./manage.py runserver 8000

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

^{pr2}$

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

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


也就是说,以后你需要弄清楚你的两个应用程序是否共享同一个数据库。如果是这样,请确保两台机器都能到达。如果不是,请确保settings.py中的DATABASES值对于每个值都是不同的。如果您共享数据库,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文件中,使用该文件来拉入应用程序的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使用name="index"定义一个URL模式,那么您将在一个带有{% url 'Ebony:index' %}的模板中获得该URL。在

相关问题 更多 >

    热门问题