Django CMS: как избежать установки SITE_ID в настройках? - PullRequest
0 голосов
/ 03 апреля 2020

Мы некоторое время используем Django CMS , и нам необходимо перенести наш сайт на многосайтовую реализацию с Django Sites Framework. Мы хотим использовать CurrentSiteMiddleware , чтобы определить, какой сайт используется (в зависимости от субдомена). В результате у нас будет установлен request.site.id промежуточным программным обеспечением, основанным на текущем запросе пользователя на наш сайт.

Я попытался найти лучший способ использования Django CMS, не разветвляя его, и не нашел хорошего способа сделать это.

Что нам на самом деле нужно:

  • каждая Страница может использоваться на текущем Сайте, или на нескольких сайтах одновременно. Для этого в документации Django рекомендуется добавить M2M FK к модели Site из каждого объекта Article (в нашем случае это объект Page). Но TreeNode имеет FK для модели Site, что означает, что только одна страница может быть сопоставлена ​​с одним сайтом. Но нам нужно сопоставить одну страницу с одним или несколькими сайтами одновременно.
  • мы хотим использовать Django Sites Framework , потому что Django имеет встроенные функции и создатели из Django используйте его в своих проектах (и это для того, что было разработано - для сопоставления некоторого объекта с одним или несколькими сайтами одновременно). На мой взгляд, это очень четкий подход - иметь многосайтовое решение, работающее на одном и том же экземпляре веб-приложения.
  • нам нужен один экземпляр приложения, потому что у нас есть общие плагины, которые нам нужны использовать в нескольких организациях (каждая организация имеет свой собственный сайт на поддомене).
  • мы планируем использовать сотни организаций, использующих нашу общую кодовую базу, и она не сможет запустить новый экземпляр для каждого нового субдомена. Также сложнее в обслуживании, обновлении и т. Д. c. Но похоже, что Django CMS в текущей реализации может работать только на один экземпляр с набором SITE_ID в файле settings.py.
  • , когда мы удаляем определение SITE_ID из settings.py , Django не может запустить веб-сервер, потому что Django CMS использует get_current_site() и get_site_id() - пытается загрузить значение SITE_ID из файла настроек. Я пытаюсь насмехаться над таким использованием, но хочу найти лучший подход для этого.

Пожалуйста, помогите нам найти способ, как продолжить использование Django CMS, без написания нашего собственного CMS-подобное велосипедное решение. Как правило, нам нравится Django CMS и мы хотим продолжать использовать его в нашем 5-летнем социальном проекте.

Нужна ваша помощь.

1 Ответ

0 голосов
/ 14 апреля 2020

После нескольких дней исследования я пришел к выводу, что Django CMS разработана таким образом, что свойство SITE_ID обязательно должно быть установлено в файле settings.py. Во многих местах нет доступа к объекту запроса, откуда мы потенциально можем распознать, какой сайт используется для выполнения запроса.

Единственный найденный мной способ - динамическое изменение настроек в своем собственном промежуточном программном обеспечении на каждом входящий запрос Это очень странная практика, но поскольку Django CMS активно используется на нашем веб-сайте, и мы не можем заменить ее прямо - нам нужно использовать этот способ взлома, по крайней мере, сейчас. И Django приложение должно быть запущено в одном потоке для реализации этого подхода.

Идея заимствована из проекта django-multisite.

...