1

Python設定ファイルを使用しています。私は次の構造を持っています:

settings
├── base.py
├── __init__.py
├── local.py
├── production.py
└── staging.py

設定モジュールは、'settings.production' などの環境変数から取得されます。これは問題なく機能し、柔軟性のない古い settings.py ファイルを置き換えて、ステージング、本番、およびローカル サイトの設定をすべて適切に整理できるようにします。

呼び出しコードの Asettings = importlib.import_module(os.environ['DJANGO_SETTINGS_MODULE'])は、新しい柔軟な設定を古いモジュールであるかのように取得します。これはクールで、ほとんどの場合機能します。

残念ながら、多くの古いレガシ コードは、「設定のインポート」を呼び出すことがあり、これは失敗します。

柔軟な設定構成の利点を失うことなくレガシー コードをサポートするには、「インポート設定」が「インポート設定.プロダクション」または環境変数で指定されているものとまったく同じである必要があります。

注:はい、これは私が古くて非常に大規模なDjango 1.3サイトで作業していますが、この質問をDjangoから独立させたと思います。

4

1 に答える 1

1

この質問を書くことはカタルシスでした。これが私の解決策です:

__init__.py私が入れた設定モジュールのために:

import os
import importlib
try:
    # Do a dynamic 'from DJANGO_SETTINGS_MODULE import *'
    settings = importlib.import_module(os.environ['DJANGO_SETTINGS_MODULE'])
    for v in dir(settings):
        if v.startswith("__"): continue
        globals()[v] = getattr(settings, v)
except ImportError, KeyError:
    # default to the production settings if environment variable not set or improperly specified
    from production import *

これは少し余分な作業を行いますが、問題をうまく解決します。これで、レガシー プログラムが必要な設定を取得します。

本質的に、これは環境変数 DJANGO_SETTINGS_MODULE で指定されているimport settings == import settings.xxx場所を作成します。settings.xxx

他の誰かがこれが役立つことを願っています。DJANGO の新しいバージョンでは、使用するアプリケーションが設定を適切にインポートする限り、この悪ふざけは不要になることに注意してください。

于 2013-07-02T06:24:29.503 に答える