0

我正在尝试在 Django 和 PostgreSQL 中实现一个多租户应用程序,每个租户都有一个单独的(但相同的)架构。

我选择租户架构:

cursor.execute('SET search_path TO ' + schemas)

我有一个中间件,可以根据主机名选择要使用的模式,所以它的工作方式如下:

foo.mysite.com --> use schema 'client_moo'
bar.mysite.com --> use schema 'client_bar'

这原则上有效,即在简单的情况下(简单的数据库查找)

但是,当我尝试登录时,事情开始崩溃。每个租户都应该有自己的、单独的登录页面,因此foo.mysite.combar.mysite.commysite.com.

但是,尝试从子域登录到管理应用程序会导致重定向回登录页面。

这是发生的事情:

  • mysite.com登录正常(架构public:)
  • foo.mysite.comn而不是登录将(HTTP 302)重定向回自身(foo.mysite.com)(模式client_foo:)

强制模式始终存在client_foo将导致mysite.com工作(即登录client_foo模式),但foo.mysite.com仍然无法工作。


完全删除模式选择(使其始终在public模式上)将使两个 URL 都可以正常登录。

4

1 回答 1

1

1) 您是否正确设置了会话 cookie 以支持跨域会话?请参阅:https ://docs.djangoproject.com/en/dev/topics/http/sessions/#session-cookie-domain

2) 如果您使用 DB 会话存储(这是默认设置),那么切换模式很可能会导致 Django 无法从数据库中获取会话(取决于中间件的顺序)。

于 2012-11-03T00:11:41.920 回答