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

标签 python django port django-dev-server

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

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

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

提前致谢

最佳答案

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

解决方案是运行多个 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)。


也就是说,稍后您需要弄清楚您的两个应用程序是否将共享同一个数据库。如果是这样,请确保两台机器都可以访问它。如果不是,请确保 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 %.

关于python - Django 在每个端口分别为每个应用程序提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23325371/

相关文章:

iphone - 如何通过 objective-c 在 iphone 上获取 tcp/udp 开放端口列表?

windows - 枚举同一进程中的开放端口

python - 如何通过从所有其他列中减去第一列来创建新的数据框?

python - Django 文档不工作

从 facebook oauth 重定向时 django session 丢失

管理中所有模型的 Django list_per_page

python - matplotlib NavigationToolbar2QT 操作中没有图形选项

python - 字符串变量的索引方法,在条件循环内,未返回所需的结果

django - 在 Django 中模型有默认的时间戳字段吗?

php - 从具有 localhost 的主机访问 Vagrant 机器上的 symfony web 服务器