Django обслуживает каждое приложение отдельно в каждом своем порту
У меня очень простой проект, работающий на Django (пока нет моделей), и мне нужно сделать следующее:
Я создал 2 приложения, 'Ebony'
а также 'Ivory'
что нужно общаться друг с другом через JSON
сообщения (изначально предназначенные для работы на разных машинах, но пока одно достаточно).
Проблема в том, что Джанго Debug
Сервер - это всего лишь один процесс, который выполняется в определенном порту. Что я хочу сделать, это сделать каждый 'App'
прослушивать собственный порт на том же сервере и, если возможно, в рамках того же проекта Django. Возможен ли такой сценарий? И если да, как я должен идти об этом?
заранее спасибо
2 ответа
Это возможно, но не так, как вы это представляете. Приложение Django - это часть того, что работает на данном веб-сервере. Таким образом, проект Django, который имеет одно или несколько приложений, выполняется как часть одного веб-сервера.
Решение состоит в том, чтобы запустить несколько экземпляров Django. Не уверен, насколько хорошо это будет работать для вас с серверами отладки. Вы можете запустить каждый сервер на своем собственном порте, задав ему параметр, указывающий, где открыть порт, например:
./manage.py runserver 8000
запускает сервер отладки на 127.0.0.1:8000 и
./manage.py runserver 8080
запускает другой сервер отладки на 127.0.0.1:8080. Обычно это делается в отдельных оболочках.
Вам необходимо убедиться, что INSTALLED_APPS
установка на одном из них имеет 'Ebony'
в этом, а другой имеет 'Ivory'
, Вам также нужно будет найти способ рассказать каждому экземпляру, как подключиться к другому (обычно, указав корневой URL-адрес).
Тем не менее, позже вам нужно будет выяснить, будут ли ваши два приложения использовать одну и ту же базу данных. Если это так, убедитесь, что обе машины могут добраться до него. Если нет, убедитесь, что DATABASES
значение в settings.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
в качестве настройки в этом файле вам не нужно, чтобы весь ваш код имел доступ к переменной среды, и вы ограничиваете логику для настройки 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
файлы, а имена вашего приложения имеют префикс с именами вашего приложения. Так что, если приложение Ebony
определяет шаблон URL с name="index"
, вы получите этот URL в шаблон с {% url 'Ebony:index' %}
,
Для тех, кто хочет иметь несколько серверов или портов для одного и того же приложения Django, но на самом деле просто пытается реализовать монолитный проект, в котором размещается как бэкэнд, так и внешний интерфейс вашего проекта, очень простое решение — добавить префиксы к каждому «серверу» или просто добавьте префикс для конечных точек серверной части, например/api/
.
Пример:
urls.py
import myproject.apps.website.views.example_view as example_view
import myproject.apps.apis.v1.example_view as api_example_view
import myproject.apps.apis.v1.example_view_2 as api_example_view_2
urlpatterns = [
path("admin/", admin.site.urls, name="admin"),
...
# Docs
path("iapi/doc/schema/", SpectacularAPIView.as_view(), name="schema"),
...
# Backend
path("api/be_page/", api_example_view.get, name="some_be_view"),
path("api/be_page_2/<str:id>/", api_example_view_2.edit, name="some_be_view_2_edit"),
# Frontend
path("", example_view.get, name="root_fe_view"),
path("fe_page/list", example_view.get, name="some_fe_view_list"),
path("fe_page/edit/<str:id>/", example_view.edit, name="some_fe_view_edit"),
]