奇怪的是,我刚刚遇到了同样的问题!查找有问题的文件(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__)))