【问题标题】:How does one set up multiple accounts with separate databases for Django on one server?如何在一台服务器上为 Django 设置多个具有不同数据库的帐户?
【发布时间】:2010-09-23 19:00:34
【问题描述】:

安装 Django 有哪些选择,以便多个用户(每个用户都有一个“帐户”)可以各自拥有自己的数据库?

语义相当直观。一个帐户可能有多个用户。一个账户有一个唯一的数据库(一个数据库对应一个账户)。图片 WordpressMU。 :)

我考虑过这个:

  1. 外部解决方案 - 多路复用到多个服务器/守护进程

    多个 Django 安装,每个 Django 安装/项目对应一个设置自己的 DATABASE_NAME 的帐户,例如

    文件系统:

    /bob
      /settings.py (contains DATABASE_NAME="bob")
    
    /sue
      /settings.py (contains DATABASE_NAME="sue")
    

    然后为 bob 和 sue 分别运行一个 Django 实例。我不喜欢这种方法——它感觉很野蛮,而且闻起来很臭。但我相信它会起作用,并且根据建议,它可能是最干净、最聪明的方法。

    应用程序可以存储在其他地方; django配置唯一需要唯一的是settings.py(即使在那里,只有DATABASE_NAME等需要不同,其余的可以导入)。

    (顺便说一下,我使用的是 lighttpd 和 FastCGI。)

  2. 内部解决方案 - Django 多路复用数据库设置

    另一方面,我曾想过安装一个 Django,并且

    (a) 为每个数据库表添加一个“prefix_”,对应登录用户的账号;或

    (b) 根据登录用户的帐号更改数据库。

    我对看到“Django 方式”来做这些特别感兴趣(希望它非常简单)。例如,中间件接受请求的用户并将 django.conf.SETTINGS['DATABASE_NAME'] 更改为该用户帐户的数据库。

    这会引发危险信号,即。这是线程安全的吗?即更改 django.conf.SETTINGS 会影响其他进程吗?更改 django.conf.SETTINGS 是否存在固有的危险——数据库连接是否已经设置?重新启动公共 API 的数据库连接部分吗? -- 当我再次查看这个问题时,我将查看 Django 源代码。

    我意识到 2(a) 和 (b) 可能要求用户身份验证以与核心不同的机制进行存储和访问。

现在,我将使用 webserver 层的外部映射 - 它是目前最简单和最干净的。但是,我不喜欢为每个帐户运行 FastCGI 守护程序的想法——这似乎不必要地浪费内存,尤其是在有 2000 多个帐户的情况下。不过,我想继续讨论这个问题,因为这是一个有趣的问题,而且对于某些情况,解决方案似乎并不理想。

意见应有尽有。 干杯

【问题讨论】:

    标签: django webserver fastcgi


    【解决方案1】:

    Django 方式肯定是使用自己的数据库名称(#1)进行单独安装。 #2 将涉及相当多的 ORM 黑客攻击,即便如此我也不太确定这是否可能。

    但请注意,您不需要为每个用户重新安装所有站点的模型/视图/模板,只需一个新的 settings.py 文件,其中包含指向公共源文件的所有适当路径。另外,要在 Apache 中运行所有这些安装,请按照我在这里的方式进行:

    <VirtualHost 1.2.3.4>
            DocumentRoot /www/site1
            ServerName site1.com
            <Location />
                    SetHandler python-program
                    SetEnv DJANGO_SETTINGS_MODULE site1.settings
                    PythonPath "['/www'] + sys.path"
                    PythonDebug On
                    PythonInterpreter site1
            </Location>
    </VirtualHost>
    
    <VirtualHost 1.2.3.4>
            DocumentRoot /www/site2
            ServerName site2.com
            <Location />
                    SetHandler python-program
                    SetEnv DJANGO_SETTINGS_MODULE site2.settings
                    PythonPath "['/www'] + sys.path"
                    PythonDebug On
                    PythonInterpreter site2
            </Location>
    </VirtualHost>
    

    假设你有 /www/site1/settings.py、www/site2/settings.py 等等...

    当然,您现在需要有一个人们登录的主站点,然后将您重定向到适当的站点(这里我只是将其命名为“site1.com”、“site2.com”,但您明白了。)

    【讨论】:

    • 不是“野蛮”或“犯规”。关键是一个应用程序有两个正在运行的实例,每个实例都有不同的配置。与生产/测试/开发的区别没有什么不同,每个都有不同的配置。
    • Gabriel,你的评论很有道理,但它给我留下了一个问题。如果唯一的区别是“DATABASE_NAME”或“DATABASE_HOST”设置,您能否对两个站点使用相同的 PythonPath 和 DocumentRoot?
    【解决方案2】:

    Django ORM 不提供多个数据库支持类,但这绝对是可能的——您必须编写一个自定义管理器并进行一些其他调整。 Eric Florenzano 有一篇很棒的文章,里面有详细的代码示例:

    http://www.eflorenzano.com/blog/post/easy-multi-database-support-django/

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 2017-02-05
      • 2010-11-11
      • 2014-11-05
      • 2016-03-28
      相关资源
      最近更新 更多