2011-07-21 13 views
1

私は、基本的に同じスキーマを持つ動的なデータベースと対話する集中型のdjangoアプリケーションを構築しています。これらのdbsは、いくつかのものがPHPにあるいくつかのレガシーアプリケーションでも使用されています。 db資格情報の複数のサイロを避けるためのソリューションは、この情報をそれぞれのアプリケーションの外にある一般的な設定ファイルに保存することです。設定ファイルは、djangoアプリケーションを再起動することなく、作成、変更、削除することができます。Djangoでの動的リクエストごとのデータベース接続

djangoアプリケーションへのリクエストごとに、httpヘッダまたはurlパラメータを使用して、使用するデータベース資格情報を判断するためにどの設定ファイルを推測するかを指定できます。

私の最初の考えは、設定ファイルを(場合によってはキャッシュで)解析し、各リクエストで新しい接続オブジェクトを作成し、ORMアクティビティの前にdjango.dbにパッチを当てるカスタムDjangoミドルウェアを使用することです。

この状況を処理するためのより優雅な方法がありますか?ミドルウェアのアプローチで考慮すべきスレッドセーフティの問題はありますか?

答えて

2

ファイルを再読み込みすると、ファイルが変更された可能性が低い場合に、支払い手当がかかることになります。

私の通常のアプローチは、すべてのリクエストでファイルを読み込もうとするのではなく、設定ファイルの変更を監視するためにINotifyを使用することです。また、ファイルから解析された「現在の」構成を維持し、設定ファイルの解析が完了したら、新しい値で置き換える傾向があります。各受信要求に対して現在の構成を設定することで、スレッドの安全性に関する懸念事項の一部を解決できるため、要求の途中で構成を変更することはできません。

+0

私は、問題の解析側のコストについてはあまり気にしません。そのため、キャッシングについて言及しました。推測されたdb名がまだ存在しない場合は、settings.DATABASESにさらに項目を追加するだけで、DB接続エラーで更新するのはかなり簡単です。より大きな問題は、ミドルウェアのアプローチが正しいかどうか、または要求/応答サイクルで遅すぎる場合やスレッドの安全性の問題が発生しやすい場合です。 – GDorn

+0

ああ、いいえ、ミドルウェアはこれを行うのに適しているようです。 – SingleNegationElimination

0

別のポートで異なるsettings.pyファイル(異なるDJANGO_SETTINGS_MODULEを設定)で異なるインスタンスを開始し、特定のアプリケーションにリクエストをリダイレクトすることができます。ちょうど私の2セント。

+0

インスタンスの数と必要なシステムレベル構成の量の点で、これはオーバーヘッドの量に起因する実際の選択肢ではありません。 – GDorn

関連する問題