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

我正在使用 django 1.4 和 celery 3.0.11。

谢谢@voithos。我试过你的解决方案。这对我有用。

但我遇到了另一种解决方案,更简单。无需创建新的模块设置。

只需将这段代码添加到您的 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 回答