私は設定は次のように実装されていることに気づいた:djangoの設定オブジェクトがLazyObjectになっているのはなぜですか? django.confで探し
class LazySettings(LazyObject):
...
設定を行うの背後にある根拠は怠惰なオブジェクトは何?
私は設定は次のように実装されていることに気づいた:djangoの設定オブジェクトがLazyObjectになっているのはなぜですか? django.confで探し
class LazySettings(LazyObject):
...
設定を行うの背後にある根拠は怠惰なオブジェクトは何?
Djangoコーディングスタイルのthis sectionを確認してください。理由はそこに説明されています(下記参照)。
サードパーティのモジュールは、パフォーマンスに加えて、インポート時に設定を変更することができます。この設定が最初に行われるようにするには、設定へのアクセスを遅らせる必要があります。
モジュールは、トップレベル django.conf.settingsに格納されている一般的な使用の設定で(モジュール がインポートされる場合、すなわち評価される)べきではありません。これは、以下の説明は、次のように設定
手動設定(すなわち DJANGO_SETTINGS_MODULE環境変数に依存せず) せことができます:
from django.conf import settings
settings.configure({}、SOME_SETTING = 'foo')ただし、settings.configure行の前にアクセスする設定が の場合、これは機能しません。 (設定は、 がまだ設定されていない場合、設定にアクセスするときに自動的に を設定するLazyObjectです)。
ので、次のようにいくつかのコードを含むモジュールがある場合:
from django.conf import settings from django.core.urlresolvers import get_callable default_foo_view = get_callable(settings.FOO_EXAMPLE_VIEW)
...その後 このモジュールをインポートすると、設定を行うことがオブジェクトの原因になります。その は、第三者が トップレベルのモジュールをインポートする機能が、手動で オブジェクトを設定する機能と互換性がなく、場合によっては非常に困難になることを意味します。代わりに、上記のコードの
、怠惰または間接のレベルは は、
django.utils.functional.lazy()
又はlambda
のようなdjango.utils.functional.LazyObject
を使用しなければなりません。
実際の設定ファイルを抽象化し、実際に必要な設定にアクセスするまで軽量化するプロキシオブジェクトです。属性にアクセスすると、要求に応じてロードされます。このアイデアは、必要になるまでローディング設定のオーバーヘッドを減らすことです。
目的は開発者の視点から設定を単純化することだと思います。だから、各プロジェクトは独自のsettings.pyファイルを持つことができ、他のすべてのDjango設定も定義する必要はありません。 LazySettings
ラッパーの種類は、Django global_settings.pyとローカル設定のすべてを組み合わせています。これにより、デベロッパーは上書きしたい設定を決定し、デフォルトを維持したい、または追加したい設定を決定できます。
クラスLazySettings
は、おそらく怠け者ではないと思うので、これは間違った名前です。 from django.conf import settings
のような操作を行うと、設定オブジェクト全体があなたのスコープに含まれます。
実際にオーバーヘッドを減らす目的はありますか?つまり、あなたは明らかに設定ファイルをロードする必要があるでしょう*、私はどんなdjangoプロジェクトも想像することはできませんので、読み込みを遅らせるのは無意味だと思われます。 –