Начальная настройка Django Sites Framework

мне комфортно с довольно одномерными реализациями Django, но теперь я пытаюсь понять процесс нескольких сайтов с общим материалом.

Я прочитал рамки сайтов Django и многие сообщения по этой теме, но я не получаю основы того, как начать второй сайт, который использует ту же базу данных, но представляет себя как отдельное доменное имя.

у меня очень счастливый и по книге сайт django, состоящий из одного приложения, работающего в проект.

чтобы использовать язык учебников, я начал проект "mysite" с

django-admin.py startproject mysite

а затем запустил приложение "опросы" с

manage.py startapp polls

Вопрос 1: предполагает ли платформа сайтов, что каждый сайт является отдельным проектом или отдельным приложением?

второе приложение "polls2" в рамках проекта, кажется, имеет смысл, но settings.py где SITE_ID определен, кажется, является целым проектом. Есть ли способ сделать app-by-app настройки?

второй proj "mysite2", соседствующий с "mysite", даст мне вторую структуру со своей собственной settings.py и отдельный SITE_ID, но тогда кажется большим нарушением принципа" сухого", так как я бы дублировал многие элементы соседнего сестринского проекта.

Вопрос 2: Похоже, мне нужно переопределить модели баз данных (models.py) в отношения "многие ко многим" для обмена данными между сайтами. Это просто меняет способ доступа Django эти таблицы, или база данных существующего сайта также должна быть перестроена?

ваше руководство о том, что предполагаемый процесс для реализации рамок сайтов будет большим и очень признателен.

1 ответов


Q1: предполагает ли платформа сайтов, что каждый сайт является отдельным проектом или отдельное приложение?

сайт Django обычно состоит из нескольких приложений, поэтому подход "одно приложение" на самом деле не работает. Но также не полезно думать в терминах отдельного проекта для каждого сайта. The только вещь, которая должна быть отдельно для каждого сайта файл настроек.

имеет ли отдельный файл настроек для каждого сайта нарушение сухого принципа? Необязательно. Вы можете (и должны) создать файл базовых настроек с общими настройками. Затем вы импортируете их в файлы параметров для каждого сайта.

например, в каталоге проекта вы можете иметь три файла настроек:

base_settings.py
siteA_settings.py
siteB_settings.py

siteA_settings.py и siteB_settings.py импортирует все настройки из base_settings.py.

единственное думаю ты обязательно поместите в файлы настроек для каждого сайта SITE_ID настройки с индивидуальный идентификатор сайта. Все остальные настройки могут быть разделены между сайтами (base_settings.py) или быть конкретным для конкретного сайта (siteA_settings.py, siteB_settings.py) в зависимости от ваших индивидуальных потребностей. Например, вы можете переопределить TEMPLATE_DIRS настройка в настройках каждого сайта, если у вас есть отдельные шаблоны для каждого сайта, но если шаблоны являются общими для всех сайтов, вам не нужно. То же самое со всеми другими настройками-структура url, список установленных приложений и т. д.

затем вы выберете, какой сайт вы хотите запустить, просто указав файлы настроек. Например, с сервером разработки Django:

python manage.py runserver --settings=mysite.siteA_settings

или

python manage.py runserver --settings=mysite.siteB_settings

Q2: Похоже, мне нужно переопределить модели баз данных (models.py) в отношения "многие ко многим" для обмена данными между сайтами. Сделать это просто измените способ доступа Django к этим таблицам, или будет существующий база данных сайта также должна быть перестроена?

модели, которые просто общий доступ между сайтами не требуется изменять, если все объекты являются общими. Только в тех случаях, когда вы хотите иметь возможность контролировать, какой объект модели появляется на каком сайте, вам нужно учитывать это, добавляя отношение (многие ко многим или внешний ключ, в зависимости от ваших потребностей) из вашей модели в Django's Site модель.

это действительно изменяет базовую структуру базы данных (поскольку добавление внешнего ключа требует дополнительного столбца в таблица базы данных для данной модели и добавление отношения "многие ко многим" требует целую дополнительную таблицу). Сама платформа сайтов также использует собственную таблицу базы данных, поэтому после ее включения необходимо синхронизировать базу данных.

после добавления отношения вы можете легко ограничить свой запрос объектами, предназначенными для текущего сайта - например, с помощью CurrentSiteManager. С другой стороны, вы все еще можете получить доступ ко всем объектам, используя диспетчер по умолчанию (то есть обычное Model.objects форма доступа к ORM).