Django 动态切换数据库
Posted
技术标签:
【中文标题】Django 动态切换数据库【英文标题】:Django switch database dynamically 【发布时间】:2012-04-12 02:02:36 【问题描述】:我想在用户登录时切换数据库。我已经创建了这个登录信号.. 但它不起作用
from django.dispatch import receiver
from django.contrib.auth.signals import user_logged_in
from django.db import connections
@receiver(user_logged_in)
def db_switch(sender, **kwargs):
user_db = 'userdb_%s' % kwargs['user'].username
cursor = connections[user_db].cursor()
数据库在settings.py
中定义。我必须使这个游标成为全球性的吗?或者这是完全错误的做法?
谢谢!
【问题讨论】:
嗯,听起来真的是 badddd 练习!为什么每个用户都应该有自己的数据库? 这是一个 SaaS 学习项目...单独的数据库是 SaaS 的一个好习惯...我找到了基于此的子域和数据库切换的示例...但我不需要那个我想根据用户切换数据库... 嗯...在我看到您的新评论之前发布了我的答案。子域是唯一的方法,因为您需要在请求开始时修改数据库,而不是在中间。我所看到的一切都表明,尝试在请求中更改全局设置是一件坏事。 谢谢乔丹,该死的我真的很想在没有子域的情况下这样做...我需要 5 个用户的顶部... 我不知道有任何 SaaS 为每个用户使用单独的数据库,但都在同一个域中...... 【参考方案1】:这是错误的做法。
老实说,我认为在 Django 中没有直接、稳定的方式来做到这一点。它不是为它设计的。
相反,我会为每个用户设置一个 settings_username
.py 文件,该文件指定一个名为个人或其他东西的辅助数据库。然后,在登录后,让他们重定向到一个新域,例如 username
.example.com,它使用一个独特的 .wsgi 文件来提取设置username
.py 文件。
现在,就系统而言,每个网站对于该用户来说都是完全独立且独一无二的。只需确保将会话 cookie 设置为 example.com,以便他们在访问其用户网站时仍处于登录状态。
【讨论】:
嗨,我不想要域,因为我不需要它们……这就是为什么我一直在寻找一种没有子域的方法……我考虑过的其他选项是 example.com/user 但我认为这很糟糕...... 听起来可能不是 Django 的框架更适合。以上是关于Django 动态切换数据库的主要内容,如果未能解决你的问题,请参考以下文章