可以在一个Heroku应用程序中有效运行多个Django站点吗?

时间:2014-01-26 23:28:56

标签: python django postgresql heroku multi-tenant

从单个Heroku应用程序运行多个站点是否可行?我问的原因是因为在大多数人重复使用相同的组件时启动多个Heroku应用程序似乎是愚蠢和不必要的。共享同一个Postgresql数据库也是有意义的,因为Django似乎支持这种行为,它的“站点”框架开箱即用。

作为我想要实现的一个例子,假设我有一个Heroku应用程序。在那个应用程序上,我有一堆Django应用程序,如“博客”,“调查”,“论坛”等。但是,我有两个名为“项目A”和“项目B”的项目,它们都使用了许多相同的项目应用程序和相同的Postgresql数据库。

如果没有黑客的解决方案,这会成为可能吗?

1 个答案:

答案 0 :(得分:1)

一般原则是使多个域或子路径指向相同的后端代码。 E.g。

 http://customer1.myapp.com/
 http://customer2.myapp.com/

http://myapp.com/customer1/
http://myapp.com/customer2/

然后,您的应用程序代码使用URL(主机名,路径等)来决定要显示的内容。 PostgreSQL的一种流行方法是SET search_path来反映当前活跃的客户,并拥有所有客户特定表的克隆。就个人而言,我认为相当清晰,而是添加一个WHERE条款术语,按客户过滤行;这样可以避免所有重复的表定义以及在进行DDL更改时产生的麻烦,并且它允许您以更灵活的方式对表进行分区。

如果您正在使用search_path,那么您必须注意应用程序级缓存,这些缓存可能无法理解它现在看到的customer_user表不是它看到的表最后一个请求,针对不同的客户。这是使用基于WHERE子句的分区的另一个好理由。

我建议为Django专用位搜索“django multi-tenancy”或“django multi-tenant”的信息;我真的在数据库后端方面和一些通用应用程序前端工作在各种工具(目前不包括Django)。