【问题标题】:Django multi-user saasDjango 多用户 saas
【发布时间】:2012-02-03 03:33:14
【问题描述】:

我正在创建一个用于学习目的的小型 saas...我知道最好的方法是为每个用户设置一个单独的架构...但是我的 saas 是一个小型应用程序,我真的不需要单独的架构加上它会使事情复杂化(以后对架构进行更改)......所以我将为所有用户使用相同的架构,只需将每个用户的 ID 附加到条目,然后在登录时仅显示用户的条目。

有没有办法在通过中间件登录时“添加”用户 ID?还是我需要调整所有查询(按用户 ID 过滤)?我已经将用户的 ID 存储到他的条目中......所以我只需要这个来选择。

谢谢!

【问题讨论】:

  • 我不知道有什么方法可以根据 request.user 自动过滤查询集。这是因为 ORM 没有与 django.contrib.auth 耦合。我做了两种 SaaS 设计,一个数据库用于所有查询集并手动过滤所有查询集(没有 django.contrib.admin),一个每个用户一个数据库,这使得启用 django.contrib.admin 变得容易(也使用 admindoc 和 django-数据库模板)。我更喜欢后者,尽管它涉及系统管理的更多工作。
  • @jpic:请将您的答案作为答案发布,以便我们对其进行投票和评论。

标签: python django saas


【解决方案1】:

我不知道有什么方法可以根据 request.user 自动过滤查询集。这是因为 ORM 没有与 django.contrib.auth 耦合。

我尝试了两种 SaaS 设计:

  1. 所有站点的 1 个数据库,以及对所有查询集的手动过滤。当然,这使得 django.contrib.admin 不可能开箱即用。可能可以使用非常严格的django-authority 甚至other django per-object permission packages (google cached version because djangopackages.com is down ATM) 设置来启用django.contrib.admin。

  2. 每个站点 1 个数据库,这更容易,保持代码更简洁,并且可以开箱即用地启用 django.contrib.admin,如果您安装 @987654324 会非常酷@。我还启用了django.contrib.admindocdjango-dbtemplates

(显然在您的情况下,1 个站点 = 1 个用户,但概念是相同的)

我更喜欢第二种实现方式,因为它显然减少了很多开发工作,而这可以通过一点系统管理来弥补。

【讨论】:

  • 您对选项#2 有什么建议吗?我真的不需要子域...这是一个小型学习项目...所以我需要在用户登录时更改架构...
  • 对于选项 #2 简短回答:我推荐一个具有 root 访问权限的服务器,uWSGI+nginx 进行部署,因为它以一种非常优雅的方式支持多站点 django 应用程序:您所要做的就是配置它N个客户一次。您选择什么数据库服务器或 Linux 发行版并不重要——您始终可以自动创建数据库。如果您愿意,我可以开源我们拥有的应用程序和配置,以便您可以复制它 - 今天晚些时候或明天。我遇到的唯一“问题”是我还没有找到多站点后台作业管理器(即 ztaskd),但在大多数情况下你不需要它。
  • 您可以通过使用指定过滤器的模型管理器覆盖模型的管理器来执行基于 request.user 过滤所有查询集的操作;因此,Thingy.objects.all() 会将您绑定到当前请求用户。或者,你可以给它一个额外的经理,这样你就可以使用Thingy.objects_for_user.all() 或类似的。
  • 如何将 request.user 传递给 all()
猜你喜欢
  • 1970-01-01
  • 2014-03-13
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2014-07-27
  • 2012-07-24
相关资源
最近更新 更多