【问题标题】:Multiple Django sites with shared codebase and DB具有共享代码库和数据库的多个 Django 站点
【发布时间】:2012-07-07 18:05:28
【问题描述】:

我为 20 个不同的国家/地区创建了一个包含 20 个站点(每个站点一个不同的域)的 Django 项目。这些网站共享所有内容:代码库、数据库、网址、模板等。

他们唯一不共享的是我在每个站点设置文件中设置的小自定义(徽标、CSS 主题的背景颜色、语言代码等)(每个站点都有一个设置文件,并且所有这些文件中的一个导入一个带有通用内容的全局设置文件)。现在,为了在开发模式下运行网站,我将这样做:

django-admin.py runserver 8000 --settings=config.site_settings.site1
django-admin.py runserver 8001 --settings=config.site_settings.site2
...
django-admin.py runserver 8020 --settings=config.site_settings.site20

我有几个问题:

  1. 我了解到可以为每个站点(域)创建一个虚拟主机并将其传递给站点的 settings.py 文件。但是,恐怕这会为每个站点创建一个 Django 实例。我说的对吗?
  2. 是否有更有效的部署方式?我读过关于 django-dynamicsites 的文章,但我不确定这是否是正确的方法。
  3. 如果我决定使用 Heroku 进行部署,Heroku 似乎希望每个应用程序只有一个设置文件,因此我需要有 20 个应用程序。有解决办法吗?

谢谢!

【问题讨论】:

标签: django heroku django-sites


【解决方案1】:

所以,我最近做了类似的事情,发现下面的策略是最好的选择。我将假设您此时熟悉 git 分支以及 Heroku 遥控器。如果不是,请先阅读以下内容:https://devcenter.heroku.com/articles/git#multiple-remotes-and-environments

我采取的主要策略是拥有一个单一的代码库(一个单一的 Git 存储库):

  • master 分支,其中包含您的所有共享代码:模板、视图、URL。
  • 许多site 分支,基于master,其中包含所有特定于站点的自定义:css、图像、设置文件(如果它们有很大不同的话)。

它的工作方式是这样的:

首先,确保您在 master 分支上。

其次,为您的一个域创建一个新的 git 分支,例如:git checkout -b somedomain.com

第三,自定义您的 somedomain.com 分支,使其看起来像您想要的那样。

接下来,通过运行 heroku create somedomain.com --remote somedomain.comsomedomain.com 实时部署到 Heroku。

现在,将您的 somedomain.com 分支代码推送到您的新 Heroku 应用程序:git push somedomain.com somedomain.com:master。这会将您的代码部署到 Heroku。

现在您已经使用自己的 Heroku 应用程序部署了您的 somedomain.com 分支,您可以通过将 --remote somedomain.com 添加到您的常规 Heroku 命令来执行所有常规 Heroku 操作,例如:

  • heroku pg:info --remote somedomain.com
  • heroku addons:add memcache:5mb --remote somedomain.com

所以,现在你基本上有了两个分支:master 分支和 somedomain.com 分支。

回到您的master 分支,为您的下一个域创建另一个新分支:git checkout master; git checkout -b anotherdomain.com。然后根据您的喜好对其进行自定义(css、特定于站点的内容),并按照我们上面所做的相同方式进行部署。

现在我相信你现在可以看到它的进展了。每个自定义domains 都有一个 git 分支,每个域都有自己的 Heroku 应用程序。好处(很明显)是这些项目自定义中的每一个都基于master 分支,这意味着您可以轻松地一次更新所有网站。

假设您更新了您的master 分支中的一个视图——您如何一次将其部署到所有您的自定义站点?轻松!

只要运行:

  • git checkout somedomain.com
  • git merge master
  • git push somedomain.com somedomain.com:master # 部署更改

并为您的每个域重复。在我的环境中,我编写了一个脚本来执行此操作,但如果您愿意,手动操作也很容易。

无论如何,希望这会有所帮助。

【讨论】:

  • 我没有想到的非常聪明的方法。但是,就我而言,我不确定它是否会更好,因为我需要拥有 N 个 heroku 应用程序,并且我需要为付费插件支付 N 次。我的方法是使用django-preferences 将所有站点特定数据(确实很少)放入数据库中。顺便说一句,有趣的是,我刚刚阅读了很棒的网站deploydjango.com,我只看到了你的回复:)
  • 随着 N 个站点的成本增加,每个应用的成本变为 N x cost
猜你喜欢
  • 2013-10-23
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 2011-03-22
  • 2011-02-13
  • 2014-03-28
  • 2012-08-19
  • 1970-01-01
相关资源
最近更新 更多