Django相对导入项目设置导致移动manage.py文件中的错误

时间:2016-12-29 19:23:44

标签: python django

按照答案中的目录结构:

Best practice for Django project working directory structure

在此处查看GitHub上的代码以进行问题排查:

django-start-template

我将manage.py移到scripts目录中。我修改了manage.pywsgi.py以获得这些行:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

而不是默认值:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj_dir.settings")

我认为基本相同。

无论如何,这是我运行python manage.py runserver时出现的错误:

  File "C:\Users\ISH~1\DJANGO~1\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named '{{ project_name }}'

我尝试过使用相对导入,但实际上无法解决问题。作为一个新手,我相信答案是非常明显的,但我已经花了几个小时阅读这个问题,并没有真正到达任何地方。

有人建议添加from . import *,但这只会导致:

Traceback (most recent call last):
  File "manage.py", line 4, in <module>
    from . import *
SystemError: Parent module '' not loaded, cannot perform relative import

virtualenv处于活动状态,我从正确的目录运行manage.py。如果它不在/scripts/中,则可以正常工作。

编辑:

我没有提到这一点,但不论是否在manage.py中都是:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj_dir.settings")

或者:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name )).settings")

结果始终为ImportError: No Module named 'xyz'。在xyz之前填写settings任何内容。

另外,如上所示,我的项目并非像第一个链接中讨论的那样100%实现。我的settings.py仍在默认位置。它基本上看起来像这样:

~/projects/django-project

/proj_dir
    settings.py
    urls.py
    wsgi.py
/scripts
    manage.py

另外,我尝试了这个,因为我认为它可能在proj_dir中寻找scripts,我实际上希望它上升到一个级别来寻找proj_dir

os.environ.setdefault("DJANGO_SETTINGS_MODULE", ".proj_dir.settings")

这只会出现以下错误。

TypeError: the 'package' argument is required to perform a relative import for '.proj_dir.settings'

那时我开始讨论importfrom . import因为文档说错误与此有关。仍无法解决问题。

2 个答案:

答案 0 :(得分:4)

如果您已将manage.py移至scripts目录,则必须将父目录显式添加到python路径。

sys.path.append('..')

不应更改设置DJANGO_SETTINGS_MODULE环境变量的行。保持为

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj_dir.settings")

答案 1 :(得分:0)

&#34; {{project_name}}&#34;似乎是占位符 - manage.py不是模板,并且您没有使用模板语法将变量放在os.environ.setdefault()的字符串中。

您需要使用正确的项目名称/模块名称。在示例repo中,正确的项目名称将是&#34; project_name&#34; (没有大括号),例如&#34; project_name.settings.development&#34;如果您使用该回购中指定的开发设置。

您看到的错误清楚地表明了行为,因为它正在寻找名为&#34; {{project_name}}&#34;的模块。因为这是提供的顶级(用点分隔)python模块名称,它不存在。