如何在一台服务器上为Django设置多个具有单独数据库的帐户?

时间:2008-11-24 15:42:32

标签: django webserver fastcgi

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

语义非常直观。帐户可能有多个用户。帐户具有唯一的数据库(并且数据库对应于帐户)。图片WordpressMU。 :)

我考虑过这个:

  1. 外部解决方案 - Multiplex to multiple servers / daemons

    多个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)可能要求以与核心不同的机制存储和访问用户身份验证。

  3. 现在,我将在网络服务器层使用外部映射 - 它现在最简单,最干净。但是,我不喜欢为每个帐户运行FastCGI守护程序的想法 - 它似乎不必要地浪费内存,特别是如果有2000多个帐户。但是,我想保持这个讨论开放,因为这是一个有趣的问题,而且对于某些情况来说,解决方案似乎并不理想。

    评论得到了赞赏。 干杯

2 个答案:

答案 0 :(得分:4)

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 / setting.py,www / site2 / settings.py等等......

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

答案 1 :(得分:1)

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

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