如何使用Python和Django创建SaaS应用程序

时间:2012-03-29 11:09:47

标签: python django saas

您能否告诉我一些允许您使用Python和Django创建SaaS(软件即服务)应用程序的文章/应用程序。

目前我不理解的一般主题是:

  1. 您是否拥有一个适用于所有客户的应用程序或每个客户端一个应用程序
  2. 如何管理每个客户端的数据库访问权限,权限或不同的数据库
  3. 是否有任何工具可以让您将一个应用转换为SaaS

4 个答案:

答案 0 :(得分:35)

  1. 一个项目,这将使维护更容易。我在django-ikari中使用中间件处理主机解析。
  2. 你没有。见#1
  3. 我使用以下内容:

  4. 虽然没有必要,但从长远来看,以下内容将有所帮助:

    • django-hunger:私人测试版注册
    • django-waffle:功能翻转
    • django-classy-tags:漂亮,简单,整洁的模板标签创建
    • django-merchant:抽象支付网关框架
    • django-mockups:快速测试模型
    • django-merlin:更好的多步形式(向导)
  5. 最后,很高兴有

答案 1 :(得分:7)

一个非常基本的,基本的例子,说明你如何去做。

假设您有一个旨在解决特定业务案例的简单应用。例如,您创建了一个应用程序来处理您办公室的房间预订。

要将此应用程序“转换”为服务,您必须对其进行配置,以便应用程序的大多数用户特定部分都是参数化的(它们可以“模板化” - 因为缺乏更好的效果字)。

这是前端转换的方式。您可以创建变量来保存应用的徽标,标题,预告片,配色方案;允许每个用户自定义他们的实例。

到目前为止,您的应用可以在前端自定义。它仍然使用第一阶段设计的相同数据库。

现在只需要显示与特定用户相关的字段。这将参数化数据库。因此,您可以添加一列,将每行标识为属于特定用户;然后创建基于登录用户过滤记录的视图或存储过程。

现在应用程序可以“租用”了;因为您可以根据用户自定义实例。

然后从这里变得更大 - 取决于应用程序的规模,类型和预期的自定义。当每个用户拥有自己的专用数据库而不是存储过程+视图组合时,您可能会认为应用程序的性能更好。

您可能决定对某些用户类型(或“包”),您需要运行应用程序的专用实例。因此,对于“高级”或“超级”用户,您希望自己的专用系统运行。

如果您的应用程序需要大量存储空间,您可能会决定单独收取存储费用。

底线是它与所使用的语言无关。它更像是一种架构和设计问题。

答案 2 :(得分:6)

软件即服务只是一个营销词,它在技术上与可通过互联网访问的服务器没有什么不同。所以问题3毫无意义。这给我们留下了问题1和问题2:

  1. 在这种情况下,你对“app”的意思是什么?您的Web应用程序(使用Python和Django构建)可以有多个Django应用程序(构成Web应用程序的组件),但我认为这不是您的意思。您可以使用Python / Django构建您的网站,并根据登录的用户(客户端)提供各种自定义选项。例如,高级客户端可以启用多个高级选项,但它仍然是相同代码库的一部分。只是某些客户

  2. 没有显示某些选项(按钮/控件等)
  3. Django拥有大量用于用户管理,权限和群组的工具。您可以为每个用户(每个客户端)授予不同的权限,这些权限决定了他们可以执行的操作。数据库访问应由您的Web应用程序管理。例如,代码确定需要在网页上显示哪些信息(取决于登录的客户端)以及该代码从数据库中检索信息。根据您的目标规模,您还可以指定应使用哪个数据库来检索信息。

答案 3 :(得分:1)

我有blog post描述了如何使用Django制作多租户SAAS Web应用程序的建议。这里的多租户意味着当用户注册时,他们拥有自己的子域。回顾一下:

  • 所有租户共享一个数据库,但每个数据库都有自己的架构。想象一下,您有网站 abc.com ,有人注册了 xyz 租户,以便他们通过 xyz.abc.com 访问他们的网页,然后进行租户 xyz 您有一个包含所有表的单独模式,因此封装了仅与 xyz 租户相关的数据。还有其他方法,例如为所有人提供一个数据库和一个模式,或者甚至有单独的数据库。但模式方法是最好的权衡。如果您感兴趣,django-tenants图书馆的文档包含更详细的信息
  • 使用django-tenants库抽象出租户的工作。当有人访问 xyz.abc.com 时,您需要知道 xyz 是租户,并且您应该使用 xyz 架构。 django-tenants库为您执行此操作,因此您可以通过简单地执行current_tenant = request.tenant
  • 获取租户对象的每个请求
  • 您需要区分共享表和特定于租户的表。例如,拥有包含订单列表的表是特定于租户的。每个租户可能拥有自己的数据库,包含所有订单。此表应位于 xyz 架构内。与此同时,您将拥有一些核心Django表,例如用户。例如,可以共享数据以禁止两个用户使用相同的电子邮件注册。
  • 您需要配置DNS以捕获通配符表达式 *。abc.com ,您可以使用{{1}在CPanel中添加 A 记录}链接到服务器的IP