リックとモーティ©。 私もバッテリーをプレゼントします。
少し前に、私は「コントロールパネル」django-projectsを作成するための小さなアプリケーションを公開しました。 開発の過程で、モジュールのデフォルト設定を保存するという些細な状況に遭遇しました。 githubをすばやく検索すると、各開発者が独自の実装を使用していることが明らかになりました。 既製のソリューションもありますが、このような単純な質問ではそれらは冗長に思えたので、賢明に行動し、自分の自転車を撮影しました。
このバッテリーはOSPユーザーだけに役立つように思えるかもしれませんが、問題はこの同じ考えを日常生活で使用できることです。
「平凡な状況」
そこで何かをするアプリケーションを書いたとしましょう。 同時に、プロジェクトのsettings.py
値を設定することもできます。この値は、すぐに使用できる値に書き換えられます。 全体として、タスク全体は次の2つになります。デフォルト値を保存し、コンシューマ開発者が設定ファイルでそれらを書き換えることです。
そのように:
# app/my_settings.py FOO = True # settings.py FOO = False # , from django.conf import settings settings.FOO False
私たちはプロジェクトで使用します
現在では、プロジェクトをモジュール化して「アプリケーション」に分割するプロジェクトを開発するのが一般的です。 モデル、ビュー、URLなど、設定を除くほとんどすべてが個々のアプリファイルに含まれています。 たとえば、ニュースレターサービスへのアダプタと、いくつかのnewsletters/adapter.py
次のコードを記述します。
adapter = Adapter(username='user', password='pass')
ハードコードのログインとパスワードはバカだと言って、定数に入れる必要があると言うなら、あなたは正しいでしょう:
USERNAME = 'user' PASSWORD = 'password' adapter = Adapter(username=USERNAME, password=PASSWORD)
近いようですが、それでもそうではありません。 別のアプローチ:
# settings.py NEWSLETTERS_USERNAME = 'user' NEWSLETTERS_PASSWORD = 'password' # newsletters/adapter.py from django.conf import settings adapter = Adapter(username=settings.NEWSLETTERS_USERNAME, password=settings.NEWSLETTERS_PASSWORD)
真実のように聞こえます。 ただし、いくつかの欠点があります。
- この
NEWSLETTERS_
あまり便利でNEWSLETTERS_
ません。 まず、コード内の文字が重複しているだけです。 第二に、値はより普遍的でより頻繁に使用される可能性があり、この理由からこの理由は悲しくなっています - これらの設定はプロジェクトに関連していませんが、別のアプリケーションに必要であり、おそらく外部では使用されません-なぜそれらをメインファイルに保持するのでしょうか?
- アプリが1人のコマンドで開発された場合、そのコミットはアプリケーションディレクトリに制限されます
django-pkgconf
これを試してみましょう:
# newsletters/conf.py from pkgconf import Conf class NewsLetters(Conf): USERNAME = 'username' PASSWORD = 'password' # newsletters/adapter.py from . import conf adapter = Adapter(username=conf.USERNAME, password=conf.PASSWORD)
条件が満たされます:プレフィックスなし、 プロジェクト設定ファイルの乱雑なし。
開発設定の値を再定義します*:
# local_settings.py NEWSLETTERS_USERNAME = 'test_user'
できた これにより、 newsletters
アプリケーション構成のUSERNAME
値が上書きされ、 PASSWORD
値は変更しなかったため同じままです。 その結果、すべての種類のDATABASES
、 TEMPLATES
などがあり、 プロジェクトに関連するもののみが存在する、整然とした整然としたsettings.py
を取得しsettings.py
。
互換性
テストはpython 2.7.9、3.4.3、3.5.0およびdjango 1.8、1.9で実施されました。
Name Stmts Miss Cover ----------------------------------------- pkgconf/__init__.py 22 0 100%
githubのプロジェクト。
* django-configurationsを使用して、これを行わないでください。