我看到了關於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