web-dev-qa-db-ja.com

実行時のDjango=設定の変更

ユーザーが快適に変更でき、Djangoを再起動する必要がないように、いくつかの(アプリ固有の)設定を管理インターフェイスに公開したいと思います。

これについてどうすればいいですか?

http://djangopackages.com/grids/g/live-setting/ でアプリケーションをチェックアウトしました(ただし、Django-constanceが最も魅力的でした)データベース内で、それらを変更するためのWebインターフェースを提供し、キャッシュします。最初の2つの機能はすでにDjangoに組み込まれていませんか?

私が見る最大の欠点は、これらの設定の古い場所(settings.py)のドロップイン置換アプリではなく、表記に移行する必要があり、多くの場合、テンプレートでアクセスするために別のコンテキストプロセッサを追加することです。

私はこれをやってもらえませんか?

  1. 設定用のモデルを作成します(これにより、さまざまなタイプと検証が得られます)
  2. このようなオブジェクトを1つインスタンス化して設定を保持します(これにより、ユーザーは管理インターフェイスでそれらを編集できます)-他のモデルのようなフィクスチャーとしてデフォルトをダンプできます
  3. Settings.pyをラップして、設定用のデータベースクエリを作成します- http://www.loose-bits.com/2011/04/extending-Django-settings-with-derived.html

私の現在の素朴な観点から見ると、唯一の欠点は次のとおりです。

  1. 利用可能な設定を追加または変更するには、スキーマの移行(南)が必要です。 -私はそれで生きることができます。
  2. おそらく複数のインスタンスを持つモデルがありますが、実際にはシングルトンのみが必要です。 -それは実際、ある時点で有用な機能になる可能性があります。
  3. パフォーマンス/キャッシュ: http://code.djangoproject.com/svn/Django/trunk/Django/conf/ を見て、設定ラッパーに少し賢さを入れなければなりません/またはモデル。モデルの変更により、キャッシュされた値がクリアまたは更新されます。 -ロケット科学ではないようです。
  4. 別のプロジェクトで同じことを行う場合も、同様の努力が必要になります。 -settings.pyには、ルックアップのモデル名とフィールド名を保持する単一の辞書定数が異なると思います。

これは両方の世界の最高のものではありません-ランタイム管理者(すべての特典)、データベースバックエンド、キャッシュ、および私の設定はありません。USED_TO_BE_IN_SETTINGS_DOT_PYは変更が必要です。何か不足していますか?

44
Danny W. Adair

知る限り、Django設定は不変であると想定されています。これには複数の理由があります。最も明らかなのは、Djangoはサーバーの実行モデルを認識しない(プリフォーク/マルチスレッド)。

また、ORMで何かを使用する前に設定を読み込む必要があるため、設定自体をDjangoモデルから読み込むことはできません。

したがって、基本的に、2つのソリューションがあります。

  • bootstrap=下位レベルのデータベースアクセスメカニズムを使用してデータベースから設定を読み込み、または
  • 他のモデルで設定を定義し、必要なときに直接取得することができます。

最初は信じられないほどのハックであり、私はそれを提案しません。 2番目の方法は、より直接的で簡潔ですが、通常の習慣を変更する必要があります(from Django.conf import settings)。

2番目のアプローチは、おそらくリンク先のサードパーティアプリによって実装されるものです。

19
André Caron
10
Chuck

DATABASESは辞書です。したがって、辞書の操作方法は次のとおりです。

import Django.conf as conf

conf.settings.DATABASES['default']['NAME'] = 'novo_banco'
6
arannasousa

settingsモジュールの推奨.configure()メソッドを使用できます。

from Django.conf import settings
settings.configure(DEBUG=True)

settingsモジュールには追加の便利な機能があります。 docs を確認してください。

2
Fusion

正直なところ、彼のコードを分析すると、Djangoになります。バージョン1.4.5では、次のモジュールに従って):

  • myproject\manage.py

  • Django\core\management__init __。py ##メソッド-execute_manager

  • Django\conf__init __。py ##クラス-LazySettings; attr-_wrapped

  • Django\utils\functional.py ##クラスLazyObject;重要なメソッド-new_method_proxy

機能的なオプションですが、リスクがあります。 python "_"では、属性が保護されていると見なされます。

from Django.conf import settings

settings._wrapped.INSTALLED_APPS = () ## *really work*

次のプロジェクト: https://github.com/alexsilva/DJPlugins 実行時にこの変数が変更されていることがわかります。プロジェクトのアイデアはすでに機能しています。

2
alex

ご覧ください: https://bitbucket.org/bkroeze/Django-livesettings * Django-LivesettingsはSatchmo Project_。 「settings.py」を編集するのではなく、管理インターフェイスを介して設定を構成する機能を提供します。*

たぶんそれはあなたに役立つかもしれません。

2
raphaelwct