【问题标题】:Django serving each app separately in each its portDjango 在其每个端口中分别为每个应用程序提供服务
【发布时间】:2014-06-13 01:43:20
【问题描述】:

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

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

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

提前致谢

【问题讨论】:

    标签: python django port django-dev-server


    【解决方案1】:

    这是可能的,但不是您将其概念化的方式。 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)。


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

    【讨论】:

    • 太棒了。您能否更具体地了解INSTALLED_APPS 设置部分?您说第一个应用程序必须包含Ebony,而另一个应用程序必须包含Ivory。但是我在Ebony 文件夹下只有一个settings.py 文件...
    • 这个问题的答案需要详细说明您希望如何执行此操作。您可以有两个单独的 Django 项目,每个应用一个,或者您可以在两台服务器上拥有一个项目。
    • 我会选择第二个选项;在两台服务器上包含两个应用程序的单个项目(目前最好是调试服务器)。我想出了如何设置INSTALLED_APPS,但我正在努力使用urls.py。问题是我无法告诉 Django 如何区分基于特定服务器实例的 url 映射。例如,假设我的urls.py 中有以下两个网址:url(r'^Ebony/$', task1)url(r'^Ivory/$', task2)。当我执行http:127.0.0.1:80/Ebony 时,我需要获取task1(Ivory 相同),但如果我执行http:127.0.0.1:8080/Ebony,我不应该获取task1。
    • 已更新以添加分片支持示例,这是您所需要的。
    • 感谢您出色而彻底的回答。效果很好!
    猜你喜欢
    • 2020-09-27
    • 2014-01-15
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多