具有共享代码库和数据库的多个Django网站

8
我已经创建了一个Django项目,其中包括20个站点(每个站点有不同的域名),分别为20个不同的国家。这些站点共享所有内容:代码库、数据库、URL、模板等等。
唯一不共享的是小的定制(如标志、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个应用程序。有解决方案吗?
谢谢!

我也遇到了同样的问题,正在寻找最佳解决方案。看一下这个链接:http://www.huyng.com/posts/franchising-running-multiple-sites-from-one-django-codebase/ - Stefan Manastirliu
1
感谢您的回答。我最终使用了https://github.com/wardi/django-dynamicsites-lite。 - Alex Gonzalez
1个回答

7
所以,我最近做了类似的事情,并发现下面的策略是最佳选择。我假设你现在已经熟悉了git分支和Heroku远程。如果你不熟悉,请先阅读这篇文章:https://devcenter.heroku.com/articles/git#multiple-remotes-and-environments 我的主要策略是使用单个代码库(单个Git存储库),其中包括:
- 一个包含所有共享代码的 master 分支:模板、视图、URL。 - 许多基于 mastersite 分支,其中包含所有特定于站点的自定义内容: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 分支,你可以通过在正常的 Heroku 命令中添加 --remote somedomain.com 来执行所有正常的 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 # 部署更改
然后为每个域重复此过程。 在我的环境中,我编写了一个执行此操作的脚本,但如果您愿意,也可以手动完成。
无论如何,希望这有所帮助。

2
非常聪明的方法,我没有想到。然而,在我的情况下,我不确定它是否更好,因为我需要有N个heroku应用程序,并且我需要为付费插件支付N次。我的方法是使用django-preferences将所有特定于站点的数据(确实很少)放在数据库中。顺便说一句,很有趣,我刚刚在阅读令人敬畏的网站deploydjango.com,然后我看到了你的回复 :) - Alex Gonzalez
随着N个站点的增加,成本也会增加,每个应用程序的成本变为“N x 成本”。 - Muhammad Taqi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接