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

Posted

技术标签:

【中文标题】Django CMS:如何避免在设置中设置 SITE_ID?【英文标题】:Django CMS: How to avoid SITE_ID to be set in settings? 【发布时间】:2020-07-16 00:20:50 【问题描述】:

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

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

我们真正需要什么:

每个页面都可以在当前站点上使用,或者同时在几个站点上使用。为此,Django 文档建议将 M2M FK 从每个 Article 对象添加到 Site 模型(在我们的例子中,它是 Page 对象)。但是TreeNode 具有Site 模型的FK,这意味着只能将一个页面映射到单个站点。但是我们需要同时将一个页面映射到一个或几个站点。 我们想使用Django Sites framework,因为 Django 内置了它,并且 Django 的创建者在他们的项目中使用它(它的设计目的是为了同时将一些对象映射到一个或几个站点) .在我看来,在同一个网络应用实例上运行多站点解决方案是一种非常清晰的方法。 我们需要一个应用程序实例,因为我们需要在多个组织之间使用共享插件(每个组织在子域上都有自己的站点)。 我们计划让数百个组织使用我们的共享代码库,但它无法为每个新子域运行一个新实例。维护、升级等也更难。但看起来当前实现中的 Django CMS 只能在 settings.py 文件中设置 SITE_ID 的每个实例中工作。 当我们从 settings.py 中删除 SITE_ID 定义时,Django 无法启动 Web 服务器,因为 Django CMS 使用 get_current_site()get_site_id() -- 尝试从设置中加载 SITE_ID 值文件。我正在尝试模拟此类用法,但想为此找到更好的方法。

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

需要你的帮助。

【问题讨论】:

【参考方案1】:

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

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

想法是从django-multisite项目借来的。

【讨论】:

以上是关于Django CMS:如何避免在设置中设置 SITE_ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何在django中设置发送邮件

如何在 django 中设置健康检查页面

如何在 ASP.net 页面中设置面包屑导航

如何在 Django 模板中的“带有模板标签”中设置 Django 渲染块值?

如何在 django 中设置 celeryconfig 文件

如何使用 Django 2.* mysqlclient 在 MySQL 数据库中设置排序规则?