具有共享代码库和DB的多个Django站点

Ale*_*lex 8 django heroku django-sites

我为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
Run Code Online (Sandbox Code Playgroud)

我有一些问题:

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

谢谢!

rde*_*ges 7

所以,我最近做了类似的事情,发现下面的策略是最好的选择.我将假设你现在熟悉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分支,使其看起来像您想要的那样.

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

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

现在您已经somedomain.com使用自己的Heroku应用程序部署了分支,您可以通过添加--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,特定于站点的东西)进行自定义,并按照我们上面所做的相同方式进行部署.

现在我相信你现在可以看到它的发展方向.我们的每个自定义都有一个git分支domains,每个域都有自己的Heroku应用程序.好处(显然)是每个项目自定义都基于master分支,这意味着您可以轻松地一次更新所有站点.

假设您更新了master分支中的一个视图- 如何将其一次性部署到所有自定义网站?容易!

赶紧跑:

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

并重复您的每个域名.在我的环境中,我编写了一个执行此操作的脚本,但如果您愿意,可以手动完成.

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

  • 非常聪明的做法,我没想到.但是,在我的情况下,我不确定它是否会更好,因为我需要有N个heroku应用程序,我需要为付费插件支付N次.我的方法是使用[django-preferences](http://github.com/praekelt/django-preferences)将所有特定于站点的数据(确实很少)放入数据库中.顺便说一句,有趣的是我刚刚阅读了很棒的网站[deploydjango.com](http://www.deploydjango.com/),我只是看到了你的回复:) (2认同)