奇妙なことに、私は同じ問題に遭遇しました!問題のファイル(billiard/forking.py
)を検索すると、次の関数が見つかりました。
def _Django_old_layout_hack__save():
if 'DJANGO_PROJECT_DIR' not in os.environ:
try:
settings_name = os.environ['DJANGO_SETTINGS_MODULE']
except KeyError:
return # not using Django.
try:
project_name, _ = settings_name.split('.', 1)
except ValueError:
return # not modified by setup_environ
project = __import__(project_name)
try:
project_dir = os.path.normpath(_module_parent_dir(project))
except AttributeError:
return # dynamically generated module (no __file__)
warnings.warn(UserWarning(
W_OLD_DJANGO_LAYOUT % os.path.realpath(project_dir)
))
os.environ['DJANGO_PROJECT_DIR'] = project_dir
この関数は、でいくつかの健全性チェックを行うようos.environ
です。を取得した後DJANGO_SETTINGS_MODULE
、モジュール名をピリオドで分割しようとすることに注意してください。このコードは、あなたDJANGO_SETTINGS_MODULE
がトップレベルのモジュールである場合(デフォルトでは)、環境が変更されていないことを前提としているようです。
残念ながら、それがトップレベルモジュールでない場合は、を使用したと想定しているようsetup_environ
であり、プロジェクトディレクトリをパスに追加する必要があります。
私の場合、単純なsettings.py
モジュールを独自のsettings
パッケージに移動し、それを共通ファイルと開発/本番ファイルに分割しました。もちろん、変更manage.py
しwsgi.py
て正しい設定モジュールを指定する必要がありました。もちろん、これがこの警告を引き起こし始めました。
DJANGO_PROJECT_DIR
私がそれを回避する方法は、変数を私のに直接追加することでしたmanage.py
。他の場所(実稼働環境など)に追加する必要があるかどうかはわかりませんが、これまでに遭遇したのはそれだけです。
これが関連する行ですmanage.py
:
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.current")
# Add the project directory to the path, to appease billiard
os.environ.setdefault("DJANGO_PROJECT_DIR",
os.path.dirname(os.path.realpath(__file__)))