Django 上的多个站点

Posted

技术标签:

【中文标题】Django 上的多个站点【英文标题】:Multiple sites on Django 【发布时间】:2013-09-21 15:46:51 【问题描述】:

我正在尝试运行大量共享大约 90% 代码的网站。它们只是为了查询 API 并返回结果而设计的。它们将有一个共同的用户群/数据库,但配置会略有不同,并且会有不同的 CSS(甚至可能是不同的模板)。

我最初的想法是将它们作为具有公共库的单独应用程序运行,但我已经阅读了有关站点框架的信息,该框架允许它们从 django 的单个实例运行,这可能有助于减少内存使用。

https://docs.djangoproject.com/en/dev/ref/contrib/sites/

我的问题是,站点框架是否是解决此类问题的正确方法,与运行单独的应用程序相比,它是否具有真正的优势。起初我认为是,但我不这么认为。我听说过:

你的 SITE_ID 是在 settings.py 中设置的,所以为了有多个 网站,你需要多个 settings.py 配置,这意味着 多个不同的进程/实例。你当然可以分享 它们之间的代码库,但每个站点都需要一个专门的工作人员/ WSGIDaemon 为网站提供服务。

如果每个站点都需要运行 UWSGI 实例,这将有效地消除在一个引擎盖下运行多个站点的任何好处。

系统的另类想法:

https://github.com/iivvoo/django_layers https://github.com/shestera/django-multisite http://www.huyng.com/posts/franchising-running-multiple-sites-from-one-django-codebase/

我不知道该采取什么路线。

【问题讨论】:

可以在运行时根据使用中间件访问的域来更改站点 ID,从而允许您使用一个应用程序在不同的 URL 上为多个 Django 站点提供服务,从而利用站点框架来隔离数据。 听起来非常完美。我认为我在“特许经营”上方的链接中使用了这种方法 有些人会争辩说更改设置是不明智的,但考虑到 Django 设置站点 ID 的方式,我不觉得这很糟糕。这当然是解决问题的一种相对简单的方法。 不一定。您始终可以根据域等导入其他设置,这与导入本地设置以进行覆盖的方式非常相似。 这与我以前使用和看到的完全不同。您是否考虑过使用 Django-CMS 作为您的“基础”应用程序?它内置了一些有趣的多域/站点功能。 【参考方案1】:

恕我直言,这归结为可能发生的变化程度、影响是什么以及发生的可能性有多大。例如:

他们将拥有一个共同的用户群/数据库

您是说同一个人使用所有网站吗?如果是这样,那么风险状况将没有不同的人(比如不同的组织)那么严重。基本上(通过良好的适当架构)您希望将事物解耦,以便当一件事发生变化时,它不会对其他一切产生巨大影响。

如果您运行同一个实例,那么一次更新每个站点很容易(假设您需要在基本系统上执行维护补丁),但另一方面可能会咬您一口(一组用户很高兴进行更改,但其他人没有 - 因为功能更改或应用补丁所需的停机时间(例如)。

在不同的实例中运行相同的代码库会带来更大的维护开销,但会消除与管理变更相关的大量风险;然后,对话就变成了如何最有效地维护同一事物的许多实例,而不是映射与您每次进行更改相关的风险。

【讨论】:

【参考方案2】:

实际上,您可以在同一个 WSGI 实例下运行这 2 个(或更多)站点。 根据您的 Django 版本和您需要的功能,存在一些缺点(例如使用 threadlocals),但所有这两种解决方案都运行良好。

Django 1.8+:https://bitbucket.org/levit_scs/airavata

Django <:1.7: href="https://bitbucket.org/uysrc/django-dynamicsites/overview" rel="nofollow" target="_blank">https://bitbucket.org/uysrc/django-dynamicsites/overview(但根据您的 Django 版本可能需要一些调整)

与 Django 站点框架相比,这两个应用程序增加的是能够根据域名轻松地在同一实例上提供站点服务。

【讨论】:

以上是关于Django 上的多个站点的主要内容,如果未能解决你的问题,请参考以下文章

通过 Gunicorn/Nginx 使用 Django 的站点框架运行多个站点

如何在由“站点”框架提供支持的多个 Django 站点中获取唯一用户?

使用 apache mod_wsgi 的 Django 多个站点:请求到错误的站点

一个 Django 实例下的多个站点 - 站点有时会提供错误的内容

Django 中的多个站点

如何为站点框架 django 设置多个 settings.py?