dj芹菜、台球和django_settings_module发出异常警告



当为异步进程运行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还是其他什么?

感谢

奇怪的是,我刚刚遇到了同样的问题!查找有问题的文件(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才能指向正确的设置模块。当然,这开始引发了这个警告。

我处理它的方法是直接在manage.py中添加DJANGO_PROJECT_DIR变量。我不确定是否需要在其他地方添加它(例如在生产环境中),但这就是我迄今为止遇到的全部内容。

这是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__)))

我使用的是django 1.4和芹菜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)

最新更新