4

複数のユーザー (それぞれが「アカウント」を持つ) がそれぞれ独自のデータベースを持つことができるように 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 を 1 つだけインストールすることを考えていましたが、

    (a) ログインしたユーザーのアカウントに対応する各データベース テーブルに「prefix_」を追加します。また

    (b) ログインしているユーザーのアカウントに応じてデータベースを変更する。

    これらを行うための「Djangoの方法」を見ることに特に興味があります(それが非常に単純なものであることを願っています)。たとえば、リクエストのユーザーを受け取り、django.conf.SETTINGS['DATABASE_NAME'] をこのユーザーのアカウントのデータベースに変更するミドルウェア。

    これは危険信号です。これはスレッドセーフですか?つまり、django.conf.SETTINGS を変更すると、他のプロセスに影響しますか? django.conf.SETTINGS を変更することには固有の危険がありますか?DB接続はすでにセットアップされていますか? パブリック API の DB 接続部分の再起動ですか? -- この問題をもう一度見るときは、Django のソースを見てみましょう。

    2(a) と (b) では、コアとは異なるメカニズムでユーザー認証を保存およびアクセスする必要がある可能性があることを認識しています。

ここでは、Web サーバー レイヤーでの外部マッピングを使用します。現時点では、これが最も単純でクリーンです。ただし、すべてのアカウントに対して FastCGI デーモンを実行するという考えは好きではありません。特に 2000 以上のアカウントがある場合は、不必要にメモリを浪費するようです。ただし、これは興味深い問題であり、特定のケースでは解決策が理想的ではないように思われるため、この議論を開いたままにしておきたいと思います。

コメントをお待ちしております。乾杯

4

2 に答える 2

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/settings.py、www/site2/settings.pyなどがあると仮定します...

もちろん、ユーザーがログインし、適切なサイトにリダイレクトされるメイン サイトが必要です (ここでは、"site1.com"、"site2.com" としていますが、おわかりいただけると思います)。 .)

于 2008-11-24T17:36:41.137 に答える
1

Django ORM は、複数のデータベース サポート クラスを提供していませんが、確実に可能です。カスタム マネージャーを作成し、その他の微調整を行う必要があります。Eric Florenzano は、詳細なコード サンプルを含む素晴らしい記事を書いています。

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

于 2008-11-24T16:48:31.390 に答える