3

非同期プロセスに対して manage.py celeryd を実行すると、すべてが期待どおりに機能しますが、起動するたびに奇妙な警告が表示されます。エラーは発生していませんが、消えたり、意味を理解するのに苦労しています。

ここにあります:

/home/user/lib/python2.7/billiard-2.7.3.15-py2.7-linux 
-x86_64.egg/billiard/forking.py:455:           
UserWarning: Will add directory '/home/user/webapps/django/proj' to path! 
This is  necessary to accommodate pre-Django 1.4 layouts using setup_environ.
You can skip this warning by adding a DJANGO_SETTINGS_MODULE=settings 
environment variable.

W_OLD_DJANGO_LAYOUT % os.path.realpath(project_dir)

django 設定モジュールが私の wsgi に追加されているため、これは珍しいことであり、これ以外のすべてで機能します。設定を httpd.conf などに追加する必要がありますか?

ありがとう

4

2 に答える 2

2

奇妙なことに、私は同じ問題に遭遇しました!問題のファイル(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.pywsgi.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__)))
于 2012-09-28T04:34:02.707 に答える
2

私はジャンゴ1.4とセロリ3.0.11を使用しています。

ありがとうございます。私はあなたの解決策を試しました。それは私のための仕事です。

しかし、私は別の解決策に出くわしました。もっと簡単です。新しいモジュール設定を作成する必要はありません。

このコードを manage.py ファイルに追加するだけです

      # Add the project directory to the path, to appease billiard
      os.environ.setdefault("DJANGO_PROJECT_DIR", os.path.dirname(os.path.realpath(__file__)))

最後に私のmanage.pyファイルは次のようになります

if __name__ == "__main__":
      os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sample.settings")

      from django.core.management import execute_from_command_line

      # Add the project directory to the path, to appease billiard
      os.environ.setdefault("DJANGO_PROJECT_DIR",os.path.dirname(os.path.realpath(__file__)))

      execute_from_command_line(sys.argv)
于 2012-10-30T21:29:57.150 に答える