繁体   English   中英

Django CMS:如何避免在设置中设置 SITE_ID?

[英]Django CMS: How to avoid SITE_ID to be set in settings?

我们正在使用Django CMS一段时间,并且需要将我们的网站迁移到使用 Django Sites 框架的多站点实施。 我们想使用CurrentSiteMiddleware来检测使用了哪个站点(基于子域)。 结果,我们将有一个由中间件设置的request.site.id ,它基于当前用户对我们网站的请求。

我试图找到如何在不分叉的情况下使用 Django CMS 的最佳方法,但没有找到如何做到这一点的好方法。

我们实际需要什么:

  • 每个页面可以在当前站点上使用,也可以同时在几个站点上使用。 为此,Django 文档建议将M2M FK 从每篇文章 object 中添加到站点model(在我们的例子中,它是 Page 对象)。 但是TreeNode具有到Site model 的 FK,这意味着只能将一个 Page 映射到单个站点。 但是我们需要将 map 一个页面同时发送到一个或几个站点。
  • we want to use Django Sites framework , because Django has it built-in and creators of Django use it on their projects (and it's for what is was designed - to map some object to one or few sites at the same time). 在我看来,在 web 应用程序的同一实例上运行多站点解决方案是非常明确的方法。
  • 我们需要有一个应用程序实例,因为我们已经共享了需要跨多个组织使用的插件(每个组织在子域上都有自己的站点)。
  • 我们计划让数百个组织使用我们的共享代码库,但它无法为每个新子域运行一个新实例。 在维护、升级等方面也更难。但看起来当前实现中的 Django CMS 只能在settings.py文件中设置SITE_ID的每个实例中工作。
  • 当我们从 settings.py 中删除 SITE_ID 定义时,Django 无法启动 web 服务器,因为SITE_ID CMS 使用设置文件中的get_current_site() get_site_id() () 和 get_current_site() 我试图模拟这种用法,但想为此找到更好的方法。

请帮助我们找到如何继续使用 Django CMS 的方法,而无需编写我们自己的类似 CMS 的自行车解决方案。 我们通常喜欢 Django CMS,并希望在我们已有 5 年历史的社交项目中继续使用它。

需要你的帮助。

经过几天的调查,我得出结论,Django CMS 的设计方式是必须在settings.py文件中设置SITE_ID属性。 在许多地方,它无法访问请求 object,从中我们可以潜在地识别出哪个站点用于发出请求。

我发现的唯一方法是在每个传入请求时动态更改我自己的中间件中的设置。 这是非常奇怪的做法,但是因为 Django CMS 在我们的网站中被积极使用,我们不能直接替换它——我们需要使用这种 hack 方式,至少现在是这样。 而 Django 应用程序需要在单线程中运行才能实现这种方法。

Idea 是从django-multisite项目中借来的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM