我正在尝试在 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.com
将bar.mysite.com
与mysite.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 都可以正常登录。