【问题标题】:Django switch database dynamicallyDjango 动态切换数据库
【发布时间】: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 为每个用户使用单独的数据库,但都在同一个域中......

标签: django


【解决方案1】:

这是错误的做法。

老实说,我认为在 Django 中没有直接、稳定的方式来做到这一点。它不是为它设计的。

相反,我会为每个用户设置一个 settings_username.py 文件,该文件指定一个名为个人或其他东西的辅助数据库。然后,在登录后,让他们重定向到一个新域,例如 username.example.com,它使用一个独特的 .wsgi 文件来提取设置username.py 文件。

现在,就系统而言,每个网站对于该用户来说都是完全独立且独一无二的。只需确保将会话 cookie 设置为 example.com,以便他们在访问其用户网站时仍处于登录状态。

【讨论】:

  • 嗨,我不想要域,因为我不需要它们……这就是为什么我一直在寻找一种没有子域的方法……我考虑过的其他选项是 example.com/user 但我认为这很糟糕......
  • 听起来可能不是 Django 的框架更适合。
猜你喜欢
  • 2019-04-02
  • 2016-12-17
  • 2021-10-22
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多