我已经看过ValueError: relative import in non-packge
的一些讨论,但是关于调用脚本的讨论似乎与我目前遇到的问题无关(或者如果他们这样做,我不太了解)足够他们如何 ......)。
昨天,我建立了一个运行Apache的新Ubuntu Server VM。我有一个Python3.4 virtualenv,Apache在运行我的Django应用程序时用于它的解释器和包目录。
我的目录结构如下所示:
目录结构
Django_proj/
manage.py
...
Django_proj/
__init__.py
wsgi.py
urls.py
settings/
__init__.py
core_settings.py
prod_settings.py
local_settings.py
logging_settings.py
目前,我正在加载local_settings.py
,我有以下相对导入:
from .logging_settings import LOGGING
但是我在Apache日志中得到了一个类似于以下内容的Traceback:
File "/PATH/TO/VIRTUALENV/lib/python3.4/site-packages/django/utils/importlib.py", line 40, in import_module
__import__(name)
File "/PATH/TO/Django_proj/Django_proj/local_settings.py", line 12, in <module>
from .logging_settings import LOGGING
ValueError: Attempted relative import in non-package
Shell Works
如果我转到顶级目录并运行(激活virtualenv之后)python manage.py shell
,则不会出现此错误:它能够成功导入local_settings.py
以及我的任何django应用程序和我可以访问变量(例如LOGGING
中的django.conf.settings
)。
wsgi.py
这是wsgi.py文件,在那里我有点疯了,将所有列出的目录添加到路径中:
import os
import sys
sys.path.append('PATH/TO/Django_proj')
sys.path.append('PATH/TO/Django_proj/Django_proj')
sys.path.append('PATH/TO/Django_proj/Django_proj/settings')
os.environ.setdefault("DJANGO_SETTINGS_MODULE",
"settings.local_settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Apache配置
Apache正在成功导入Django并使用正确的Python解释器(可以在Traceback中看到),但我认为Apache可能会运行应用程序有些奇怪,所以除了wsgi.py
中的路径,我将我能想到的所有内容添加到WSGIDaemonProcess path
。这是我的 httpd.conf :
LoadModule wsgi_module modules/mod_wsgi.so
ServerName localhost
WSGIRestrictEmbedded On
WSGILazyInitialization On
WSGIDaemonProcess django-proj.org processes=2 threads=12 python-path=/virtualenv/PATH/lib/python3.4/site-packages:/virtualenv/PATH/bin:/PATH/TO/Django_proj:/PATH/TO/Django_proj/Django_proj:/PATH/TO/Django_proj/Django_proj/settings
WSGIProcessGroup django-proj.org
但是我不太了解当Apache为了运行wsgi.py
而旋转Python时所发生的情况。我想如果我只是在任何地方添加了所有相关路径,那么问题应该消失,Python应该能够从logging_settings.py
本地查找并导入local_settings.py
。但是,local_settings.py
似乎是非包裹。
无论如何,我很困惑,为什么我收到这个错误,我很感激知道Stack Overflowers的输入。
修改:我应该提一下,我已多次阅读以下文档,这很有用:https://code.google.com/p/modwsgi/wiki/IntegrationWithDjango
答案 0 :(得分:1)
嗯,这很令人尴尬,但我真的不知道我做了什么来解决这个问题。但是,它是固定的。这就是我的所作所为。
我的源安装Python shell没有使用readline(没有历史记录),我遇到了一个无关的问题,我按照此处的描述进行了修复:https://stackoverflow.com/a/25942732/1748754
我需要在构建readline之后重新编译Python,并且因为这一切都在VM上(使用Vagrant和Ansible设置),我只是将其销毁并重建它。
之后,我注意到在我的wsgi.py
中,我以奇怪的方式导入设置,所以我只是按照以下方式附加了主项目路径和导入的设置:
<强> wsgi.py 强>
import os
import sys
sys.path.append('/PATH/TO/Django_proj/Django_proj/')
os.environ.setdefault("DJANGO_SETTINGS_MODULE",
"Django_proj.settings.local_settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
我做了这个更改是因为我意识到wgsi.py
和manage.py
以不同方式导入settings.py
,因此我将wsgi.py
更改为manage.py
。
很难相信readline缺失会导致我出现其他错误,如果是这样,这可能是非常具体的,对任何其他人都没用。
问题是,只有在我完成所有其他工作后才检查它是否有效。
无论如何,有点尴尬的是不知道是什么解决了问题,它涉及完整的os-teardown-and-rebuild(使用Vagrant / Ansible非常容易),但确实如此。