我正在尝试在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
不同{1}}。
但是,尝试从子域登录管理应用程序会导致重定向回登录页面。
以下是发生的事情:
mysite.com
正常登录(架构:public
)foo.mysite.comn
而不是登录会将重定向(HTTP 302)重定向回自身(foo.mysite.com
)(架构:client_foo
)强制架构始终为client_foo
将导致mysite.com
正常工作(即登录client_foo
架构),但foo.mysite.com
仍无效。< / p>
完全删除模式选择(以便它始终位于public
模式上)将使两个URL都正常登录。
答案 0 :(得分:1)
1)您是否正确设置了会话cookie以支持跨域会话?请参阅:https://docs.djangoproject.com/en/dev/topics/http/sessions/#session-cookie-domain
2)如果您正在使用数据库会话存储(这是默认设置),那么切换模式很可能会导致Django无法从数据库中获取会话(取决于您的中间件的顺序)。