我看到了关于ValueError: relative import in non-packge
的大量讨论,但关于调用脚本的讨论似乎与我目前遇到的问题有关(或者如果他们这么做,我不够好懂得他们如何 ......)。Django Apache ValueError:试图在非包中导入相对导入
昨天,我建立了一个运行Apache的新Ubuntu服务器虚拟机。我有一个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日志,看起来像下面这样:
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
壳牌工作
如果我去的顶级目录并运行此错误不会出现(激活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 Config
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
但我不明白,也有足够的了解,当阿帕奇才能运行wsgi.py
旋转起来的Python正在发生的条件。我想如果我只是在所有地方添加所有相关路径,那么问题应该消失,Python应该能够从local_settings.py
本地查找并导入logging_settings.py
。但是,看起来local_settings.py
是非包装。
无论如何,我很困惑,为什么我收到这个错误,我希望知道堆栈溢出的输入。
编辑:我要指出,我已阅读下列文件多次为好,它是有用的:https://code.google.com/p/modwsgi/wiki/IntegrationWithDjango